Обзор системы
«АэроБокс» — система управления задачами и проектами для бизнеса: продажи, работа, коммуникации, учёт и работа с клиентами в одном окне. Эта Wiki описывает каждый модуль: что это, зачем, как работает и как этим пользоваться — со скриншотами, взаимосвязями и пошаговыми инструкциями.
Из чего состоит система
Как всё связано
Все модули работают с единой базой и обмениваются данными: Контрагент появляется в Сделке, из сделки собирается Документ и счёт, задачи по сделке видны в Проекте и Задачах, переписка — в Почте, а клиент видит свою часть в Портале и Витрине. Автоматизации и бизнес-процессы связывают этапы между собой. Технически всё это описано в разделе Архитектура системы.
Сделки
Ядро продаж: карточки сделок движутся по этапам воронки от первого контакта до реализации, с задачами, составом, платежами, документами и автоматизациями.

Назначение
Раздел «Сделки» — это pipeline (воронка продаж). Каждая сделка — это одна потенциальная продажа с бюджетом, ответственным менеджером, контактом и компанией. Сделки распределены по этапам внутри воронки и наглядно показывают, на какой стадии находится каждая продажа, где деньги «зависают» и что сделать следующим шагом. Поддерживается несколько параллельных воронок (например, «Основная воронка», «Повторные продажи», «Тендеры») — каждая со своим набором этапов.
Что делает
- Показывает открытые сделки выбранной воронки в двух режимах: Канбан (колонки-этапы) и Список (таблица).
- Перетаскивание сделки между колонками (drag & drop) меняет её этап и запускает автоматизации этого этапа.
- Считает сумму бюджетов по каждому этапу и итог по воронке.
- Подсвечивает зависшие сделки — открытые сделки без единой активной (незакрытой) задачи; их легко потерять. Отдельный чип-фильтр «Зависшие» показывает только их.
- Фильтр по ответственному менеджеру и общий поиск по названию и кастомным полям.
- Карточка сделки (правая выдвижная панель) с вкладками: Основное, Состав, Задачи, Платежи, Документы, История.
- Состав сделки из товаров каталога с автопересчётом бюджета и выставлением счёта одной кнопкой.
- Закрытие сделки как Реализована (won, с конфетти) или Не реализована (lost), возврат закрытой сделки в работу.
- Инлайн-правка бюджета двойным кликом по ячейке в таблице.
- Массовые действия над выбранными сделками: сменить этап, назначить ответственного, добавить тег, удалить.
- Сортировка таблицы по столбцам, экспорт в CSV (с учётом фильтров) и импорт сделок из CSV.
- Автоматизации этапов: при попадании сделки на этап — создать задачу, сменить ответственного, добавить метки, перенести на другой этап.
- Редактирование этапов воронки (добавить, переименовать, удалить) и создание новых воронок.
- Карточка-чеклист «Первые шаги» (онбординг) над канбаном — считается по реальным данным, закрывается насовсем.
Основные экраны и элементы
Верхняя панель (toolbar). Слева — выпадающий список воронки и фильтр ответственного («Все ответственные» или конкретный сотрудник). Чип «Зависшие» со счётчиком включает показ только сделок без активной задачи. Справа — переключатель режима «Канбан» / «Список», кнопка импорта CSV (иконка), кнопка экспорта CSV, кнопка «Автоматизация» (с бейджем числа активных правил) и «Этапы» (настройка этапов воронки). Часть кнопок видна только при праве на запись в соответствующий домен.
Режим «Канбан». Колонки соответствуют этапам воронки. В шапке колонки — цветная точка этапа, название, счётчик карточек, сумма бюджетов по этапу и (если есть) значок молнии «на этапе есть автоматизация». Карточка сделки показывает теги, название, бюджет, контакт, флаг задачи (ближайший срок или красное «без задачи»), возраст сделки в днях (жёлтый после 14 дней, красный после 30) и аватар ответственного. Внизу каждой колонки — кнопка «+ Сделка» для быстрого создания на этом этапе. Карточки перетаскиваются мышью между колонками.
Режим «Список». Таблица со столбцами: чекбокс выбора, Сделка (название + компания), Этап (цветная пилюля), Бюджет, Контакт, Ответственный (аватар + имя), Следующий шаг (пилюля срока задачи и её название, либо «без задачи»), кастомные поля, меню действий. Заголовки Сделка / Этап / Бюджет / Ответственный и кастомные поля — сортируемые. По двойному клику на ячейку «Бюджет» — инлайн-правка суммы. В подвале — итоговое количество и сумма бюджетов. На узких экранах (<560px) таблица заменяется карточками.
Панель массовых действий (bulk-bar). Появляется при выделении чекбоксов: показывает «Выбрано: N · сумма», выпадающие «Сменить этап…» и «Ответственный…», кнопки «Тег», «Удалить» и «Снять выбор».
Карточка сделки (правая панель, drawer). Заголовок с названием, кнопками «Редактировать» и «Закрыть», статусной пилюлей (этап / Реализована / Не реализована) и названием воронки. Вкладки:
- Основное — трек-прогресс по этапам, свойства (Бюджет, Воронка, Этап, Контакт, Компания, Ответственный, Создана, Закрыта, Теги, кастомные поля) и поле «Примечание».
- Состав — позиции из товаров: наименование, артикул, количество, цена, сумма; добавление позиции (выбор товара + количество); при изменении состав пересчитывает бюджет сделки; кнопка «Выставить счёт на сумму» создаёт счёт (invoice).
- Задачи — список задач по сделке, кнопка «Поставить задачу».
- Платежи — карточка «Оплачено по сделке» с прогресс-баром (% от бюджета) и список проведённых/плановых платежей.
- Документы — документы, привязанные к сделке (договор, счёт, акт), кнопка «Создать документ».
- История — лента активности по сделке (смена этапа, правки, автоматизации).
Внизу карточки открытой сделки — кнопки «Реализована» и «Не реализована»; у закрытой — «Вернуть в работу».
Модалка сделки (создание/редактирование). Поля: Название, Бюджет, Этап, Контакт, Компания, Ответственный, Теги (с кликабельными подсказками из справочника), Проект, кастомные поля. При редактировании — кнопка «Удалить».
Автоматизация воронки. Правило привязано к этапу и срабатывает, когда сделка попадает на этап (переносом, при создании или конвертации заявки). Действия правила: создать задачу (название, тип, срок в днях), сменить ответственного, добавить метки, перенести сделку на другой этап (выполняется последним, без повторного запуска правил — защита от цикла). Правила включаются/выключаются переключателем.
Этапы. Модалка «Этапы воронки»: переименование, добавление и удаление этапов. Нельзя удалить последний этап и этап, на котором ещё есть открытые сделки.
Как пользоваться — пошагово
- Откройте раздел «Сделки». Выберите нужную воронку в выпадающем списке слева.
- Создайте сделку кнопкой «+ Сделка» в колонке этапа (в канбане), «+ Создать» или клавишей D. Заполните название, бюджет, контакт/компанию, ответственного, теги.
- Ведите сделку по этапам: в канбане перетащите карточку в следующую колонку; в списке — через массовое действие «Сменить этап» или в карточке.
- Откройте карточку сделки кликом. На вкладке «Состав» добавьте товары — бюджет пересчитается. При необходимости нажмите «Выставить счёт».
- На вкладке «Задачи» поставьте следующий шаг, чтобы сделка не попала в «зависшие».
- Настройте автоматизации кнопкой «Автоматизация»: например, при попадании на этап «КП отправлено» — создавать задачу «Связаться с клиентом» через 2 дня.
- Когда сделка выиграна — откройте её и нажмите «Реализована» (won); если проиграна — «Не реализована» (lost).
- Для отчётности экспортируйте текущий список кнопкой экспорта CSV.
Взаимосвязи
- Связан с Заявками: заявка конвертируется в сделку (создаётся новая карточка сделки, а заявка получает статус «Сконвертирована» и ссылку на сделку).
- Связан с Товарами: состав сделки собирается из позиций каталога; бюджет считается из количества × цены.
- Связан с Контрагентами: у сделки есть контакт и компания; их карточки открываются из сделки.
- Связан с Финансами: из состава сделки выставляется счёт (invoice); платежи и оплата отражаются на вкладке «Платежи».
- Связан с Документами: договоры, счета и акты привязываются к сделке и видны на её вкладке «Документы».
- Связан с Проектами: сделку можно привязать к проекту (поле «Проект» в модалке сделки).
- Задачи по сделке формируют «Следующий шаг» и признак «зависшей» сделки.
Под капотом (технически)
Раздел работает с коллекциями deals, funnels и automations, а также опирается на tasks, products, invoices, payments, contacts, companies, documents. Каждая коллекция синхронизируется с сервером через GET /api/state (загрузка) и PUT /api/state (сохранение изменённых коллекций с версиями-ревизиями и слиянием при конфликте). Право на запись в deals и funnels даёт домен sales / config роли; при отсутствии права правка откатывается сервером.
Воронка (funnels) содержит массив этапов stages — каждый этап это { id, name, color }. Сделка ссылается на воронку и этап по id.
| Поле | Тип | Описание |
|---|---|---|
| id | строка | Уникальный идентификатор сделки. |
| name | строка | Название сделки. |
| funnelId | строка | Ссылка на воронку. |
| stageId | строка | Ссылка на текущий этап воронки. |
| amount | число | Бюджет сделки (₽). Пересчитывается из состава, если он задан. |
| contactId | строка | Ссылка на контакт. |
| companyId | строка | Ссылка на компанию. |
| ownerId | строка | Ответственный менеджер (сотрудник). |
| tags | массив строк | Теги сделки (подсказки из справочника «Теги сделок»). |
| status | строка | open — в работе, won — реализована, lost — не реализована. |
| createdAt / closedAt | дата | Дата создания и (для закрытых) дата закрытия. |
| note | строка | Примечание по сделке. |
| items | массив | Состав: позиции { id, productId, qty, price }. |
| projectId | строка | Необязательная привязка к проекту. |
| custom | объект | Значения кастомных полей. |
Правило автоматизации (automations) содержит: funnelId, stageId, enabled и блоки действий createTask (title, type, dueDays), setOwner (userId), addTags (tags), moveTo (stageId). Признак «зависшей» сделки вычисляется на лету: у сделки нет ни одной задачи с done === false.
Заявки
Входящие обращения с сайта, лендингов, рекламы и мессенджеров: первичная обработка, контроль скорости ответа (SLA) и конвертация в сделку.

Назначение
Раздел «Заявки» (лиды) — точка входа новых обращений в CRM. Сюда автоматически попадают заявки из подключённых источников (форма сайта, лендинг Tilda, ВКонтакте, Яндекс.Директ, WhatsApp), а также заявки, заведённые вручную. Задача раздела — быстро взять обращение в работу, связаться с клиентом и, если оно целевое, превратить его в сделку. Отдельный акцент — на скорости первого ответа: раздел следит за SLA и подсвечивает просроченные заявки.
Что делает
- Собирает входящие обращения в единый список с фильтрами по статусу.
- Показывает статистику: новые заявки, средняя скорость первого ответа, сколько сконвертировано, конверсия заявок в %.
- Контролирует SLA первого ответа: у новых заявок показывает, сколько они ждут, и краснеет при просрочке порога (по умолчанию — заданное число часов из сценария).
- Два режима: Список (таблица) и Канбан (колонки-статусы).
- Действия по заявке: «Взять в работу», «В сделку» (конвертация), открыть связанную сделку, отклонить с причиной, удалить (в корзину).
- Карточка заявки (правая панель) с быстрыми действиями «Позвонить», «Написать», «Задача», «Передать», текстом обращения, свойствами, задачами и таймлайном истории.
- Помечает заявку горячей (★) — такие поднимаются вверх списка.
- Определяет дубль: если контакт с таким телефоном/email уже есть в базе, предлагает привязать заявку к нему без создания дубля.
- Конвертация в сделку: создаёт сделку (и при необходимости новый контакт), фиксирует первый ответ и связывает заявку со сделкой.
- Отклонение с обязательной причиной — для аналитики потерь.
- Ручное создание заявки и передача заявки другому менеджеру.
Основные экраны и элементы
Плитки статистики (stat-grid). Четыре карточки: «Новые заявки» (ждут первого ответа), «Средний ответ» (скорость первой реакции, зелёный при укладывании в SLA), «Сконвертированы» (стали сделками), «Конверсия заявок» (% сконвертированных, с числом отклонённых).
Панель фильтров (чипы). Чипы по статусам со счётчиками: «Все», «Новые», «В работе», «Сконвертированы», «Отклонённые». Справа — переключатель «Список / Канбан» и кнопка «Заявка вручную».
Режим «Список». Таблица со столбцами: Заявка (имя + текст обращения, ★ у горячих, причина отказа у отклонённых), Источник (цветная пилюля), Контакты (телефон + email), Статус (скрывается, если активен чип конкретного статуса), Менеджер, Получена, действия. Столбец «Получена» показывает: для отвеченных — зелёную скорость первого ответа; для новых — относительное время ожидания (красное при просрочке SLA). В строке — быстрые кнопки: «Взять в работу» (у новых), «В сделку» (у взятых в работу), «Сделка» (у сконвертированных) и меню.
Режим «Канбан». Колонки-статусы: «Новые», «В работе», «Сконвертированы», «Отклонены». Карточка заявки показывает имя (★ у горячих), источник, причину отказа, текст обращения, телефон, чип времени (для новых — ожидание с SLA, для прочих — когда получена) и аватар менеджера. Карточки перетаскиваются между колонками (кроме сконвертированных). Перенос в «Сконвертированы» перетаскиванием запрещён — конвертация делается через карточку. Перенос в «Отклонены» открывает модалку выбора причины.
Карточка заявки (правая панель). Заголовок с именем (★-переключатель «горячая»), статусной пилюлей и источником. Плашка «Похоже, клиент уже в базе» — если найден дубль-контакт. Быстрые действия: «Позвонить» (фиксирует звонок и открывает набор), «Написать» (открывает почтовый композер с подстановкой), «Задача» (ставит задачу по заявке), «Передать» (сменить менеджера). Блок «Текст обращения», список свойств (Телефон, Email, Источник, Получена, Первый ответ, Приоритет, Менеджер, Причина отказа, Сделка), «Задачи по заявке», поле добавления заметки и таймлайн «История и заметки». Внизу — кнопки по статусу: «Взять в работу», «В сделку» + «Отклонить», «Вернуть в работу», «Открыть сделку».
Модалка конвертации в сделку. Показывает текст заявки; поля: Название сделки (по умолчанию «Заявка: имя»), Бюджет, Этап (из первой воронки), выбор контакта (привязать к дублю или создать нового), Ответственный. По сохранению создаётся сделка (с тегом «Заявка» и примечанием об источнике), заявка помечается «Сконвертирована», запускаются автоматизации этапа.
Модалка отклонения. Обязательная причина из списка (Нецелевой запрос, Нет бюджета, Выбрал конкурента, Не выходит на связь, Дубль, Спам / ошибка) и необязательный комментарий.
Модалка «Новая заявка». Поля: Имя / компания, Телефон, Email, Источник, Текст обращения.
Как пользоваться — пошагово
- Откройте раздел «Заявки». Новые обращения видны в чипе «Новые» и вверху списка.
- Возьмите заявку в работу кнопкой «Взять в работу» — вы становитесь её менеджером, фиксируется первый ответ.
- Откройте карточку и свяжитесь с клиентом: «Позвонить» или «Написать». Каждое действие попадает в таймлайн.
- При необходимости пометьте заявку горячей (★), поставьте задачу или передайте её другому менеджеру.
- Если обращение целевое — нажмите «В сделку». Проверьте название, бюджет, этап; если клиент уже в базе, оставьте галочку привязки к существующему контакту.
- Если заявка нецелевая — «Отклонить» и укажите причину; она уйдёт в статус «Отклонена» и учтётся в аналитике потерь.
- Отклонённую или сконвертированную заявку при необходимости можно вернуть в работу.
- Заявку вручную (например, звонок клиента) добавьте кнопкой «Заявка вручную».
Взаимосвязи
- Связан со Сделками: конвертация заявки создаёт сделку и проставляет её ссылку в заявке; запускаются автоматизации этапа.
- Связан с Контрагентами: при конвертации создаётся новый контакт или заявка привязывается к найденному дублю по телефону/email.
- Связан с Задачами: по заявке ставятся задачи (leadId), они видны на её карточке.
- Связан с Почтой: кнопка «Написать» открывает композер письма с подстановкой email и приветствия.
- Источники заявок настраиваются в разделе Настройки → Интеграции (формы сайта, WhatsApp, ВКонтакте и т.д.).
Под капотом (технически)
Раздел работает с коллекцией leads; связанные — deals, contacts, tasks. Право на запись в leads дают домены sales и marketing. Синхронизация — через GET/PUT /api/state. Новые заявки с сайта принимает серверный публичный эндпоинт формы и кладёт их в leads со статусом new; серверный планировщик умеет напоминать о заявках, которые ждут ответа дольше порога SLA. Порог SLA берётся из параметра сценария sc_lead_sla (ключ hours). Заявки старого формата дозаполняются на лету (поля notes, priority).
| Поле | Тип | Описание |
|---|---|---|
| id | строка | Идентификатор заявки. |
| name | строка | Имя клиента или название компании. |
| phone / email | строка | Контакты клиента. |
| source | строка | Источник: site, tilda, vk, ads, whatsapp. |
| message | строка | Текст обращения. |
| date / time | дата / время | Когда заявка получена. |
| status | строка | new, progress (в работе), converted, rejected. |
| ownerId | строка | Менеджер, ведущий заявку (у новых — null). |
| priority | строка | normal или hot (горячая). |
| firstResponseAt | объект | Дата/время первого ответа менеджера — для расчёта скорости и SLA. |
| convertedDealId | строка | Ссылка на созданную сделку (после конвертации). |
| rejectReason | объект | Причина отказа: { code, label, comment }. |
| notes | массив | Таймлайн: записи { id, date, time, userId, kind, text }, где kind — status/note/call/email/task/system. |
Товары
Каталог товаров и услуг: из его позиций собирается состав сделок и печатные формы счетов и коммерческих предложений.

Назначение
Раздел «Товары» — единый каталог того, что компания продаёт: физические товары, лицензии, услуги. Позиции каталога используются в составе сделок (для расчёта бюджета) и в печатных формах — счетах и коммерческих предложениях. Каталог задаёт стандартные наименования, артикулы, единицы измерения и базовые цены, чтобы менеджеры не вводили их вручную каждый раз.
Что делает
- Ведёт список товаров/услуг с наименованием, артикулом, категорией, ценой и единицей измерения.
- Показывает, в скольких сделках используется каждая позиция.
- Сортировка по столбцам (Наименование, Артикул, Категория, Цена), поиск по названию и артикулу.
- Создание, редактирование, дублирование и удаление позиций (удаление — в корзину).
- Карточка товара (правая панель): метрики (цена, число сделок и единиц, выручка по реализованным сделкам) и список сделок, где используется товар.
- Экспорт каталога в CSV.
- Подсказки категорий из единого справочника «Категории товаров».
Основные экраны и элементы
Верхняя панель. Слева — счётчик «N позиций · M категорий». Справа — кнопка экспорта CSV и «+ Товар».
Таблица каталога. Столбцы: Наименование (с иконкой и подписью «в N сделках», если товар где-то используется), Артикул, Категория (цветная пилюля), Цена, Единица, кнопка удаления. Заголовки Наименование / Артикул / Категория / Цена — сортируемые. Клик по строке открывает карточку товара.
Модалка товара (создание/редактирование). Поля: Наименование, Артикул, Категория (с автоподсказкой из справочника, произвольные значения тоже разрешены), Цена (₽), Единица (по умолчанию «шт»).
Карточка товара (правая панель). Заголовок с названием, пилюлей категории и артикулом. Кнопки «Редактировать», «Дублировать», «Удалить» (при праве на запись; иначе — «Только просмотр»). Три метрики: Цена (за единицу), В сделках (число сделок и суммарное количество единиц), Выручка (won) — сумма по реализованным сделкам. Ниже — таблица «Где используется»: сделка, её этап/статус, количество и сумма по позиции; клик открывает карточку сделки.
Удаление. Если товар входит в сделки — предупреждение, что позиции сохранятся, но будут помечены «Товар удалён»; товар уходит в корзину.
Как пользоваться — пошагово
- Откройте раздел «Товары». Нажмите «+ Товар».
- Введите наименование, артикул, выберите или впишите категорию, укажите цену и единицу измерения. Сохраните.
- Найдите нужную позицию поиском или сортировкой; кликните строку, чтобы открыть карточку и увидеть, где товар используется и какую выручку принёс.
- Чтобы завести похожую позицию — откройте карточку и нажмите «Дублировать», затем поправьте отличия.
- Добавляйте товары в сделки на вкладке «Состав» карточки сделки — оттуда бюджет и счета считаются автоматически.
- Устаревшие позиции удаляйте (уходят в корзину); при использовании в сделках система предупредит о последствиях.
- Для выгрузки прайса используйте экспорт CSV.
Взаимосвязи
- Связан со Сделками: позиции каталога образуют состав сделки (
items), а их количество и цена формируют бюджет. - Связан с Финансами: состав сделки переносится в счёт (invoice), выставляемый одной кнопкой.
- Связан с Документами: позиции печатаются в счетах и коммерческих предложениях (печатные формы).
- Категории берутся из единого справочника Настройки → Справочники → Категории товаров.
Под капотом (технически)
Раздел работает с коллекцией products; связанные — deals (через items[].productId), invoices, documents. Право на запись в products даёт домен catalog. Синхронизация — через GET/PUT /api/state. Метрики карточки (число сделок, единиц, выручка won) считаются на лету перебором сделок и их состава. При печати счёта/КП позиции состава подставляются только если их сумма совпадает с суммой документа; иначе печатается одна строка на сумму документа (чтобы «Итого» в платёжке не разошлось со счётом).
| Поле | Тип | Описание |
|---|---|---|
| id | строка | Идентификатор товара. |
| name | строка | Наименование товара или услуги. |
| sku | строка | Артикул. |
| category | строка | Категория (например, Оборудование, Лицензии, Услуги, Мебель, Безопасность). |
| price | число | Базовая цена за единицу (₽). |
| unit | строка | Единица измерения (шт, узел, мес, услуга, проект и т.п.). |
Позиция в составе сделки хранится отдельно как { id, productId, qty, price } — цена копируется из товара в момент добавления, поэтому позднее изменение цены в каталоге не меняет уже собранные сделки.
Контрагенты
Единая база всех, с кем работает компания: люди (контакты) и организации (компании). Раздел хранит их профили, историю отношений и всю иерархию связей — контакт привязывается к компании, у компании собираются сделки, договоры, задачи и деньги. Отсюда открывается карточка контрагента, из которой видно всё общение и документооборот в одном месте.

Назначение
Раздел «Контрагенты» — это адресная книга и досье компании одновременно. Он отвечает на вопросы «кто наш клиент», «в какой он организации», «сколько с ним сделок в работе», «на какую сумму мы уже с ним заработали» и «какие договоры и счета по нему подписаны». Контакт — это конкретный человек (ФИО, должность, телефон, email), компания — юридическое лицо (название, ИНН, сайт, адрес). Один человек привязывается к одной компании, а в компании может быть сколько угодно сотрудников. Все остальные разделы системы (Сделки, Документы, Задачи, Финансы) ссылаются именно на записи из этого раздела.
Что делает
- Хранит два связанных списка — Контакты (люди) и Компании (организации), переключаемых вкладками в верхней панели с живым счётчиком записей.
- Показывает по каждому контакту его компанию, телефон, email, ответственного менеджера, число открытых сделок и их сумму «в работе».
- Показывает по каждой компании ИНН, телефон, сайт, число открытых сделок и оборот (сумму всех проведённых поступлений от неё).
- Открывает карточку контрагента (выезжающую панель справа — drawer) с вкладками: профиль/обзор, сделки, задачи, документы, финансы (у компаний) и история изменений.
- Собирает в карточке всю иерархию связей: Контрагент → Сделка → Договор → дочерние документы (допсоглашения, счета, акты) деревом.
- Позволяет создавать, редактировать и удалять записи (удаление — в Корзину, откуда всё восстановимо), с проверкой дубликатов по телефону, email и имени.
- Поддерживает поиск, сортировку по столбцам, кастомные поля, массовые операции (сменить ответственного, отправить в корзину), импорт из файла и экспорт в CSV.
- Даёт быстрый предпросмотр контакта или компании при наведении курсора на её имя (всплывающая мини-карточка со ссылкой «Открыть»).
Основные экраны и элементы
Подшапка (subnav). Две кнопки-вкладки — «Контакты» и «Компании» — со счётчиком количества записей. Переключение меняет содержимое списка ниже.
Панель инструментов (toolbar). Справа расположены кнопки «Импорт» (загрузка списка из файла), иконка «Экспорт CSV» и синяя кнопка добавления — «+ Контакт» или «+ Компания» в зависимости от активной вкладки. Кнопки создания и импорта видны только тем, у кого есть право на запись в разделе.
Список контактов. Таблица со столбцами: чекбокс выбора, Имя (аватар + должность), Компания, Контакты (телефон и email), Сделок (число открытых), В работе (сумма открытых сделок), Ответственный, столбцы кастомных полей и меню действий (три точки). На узких экранах (телефон) таблица заменяется компактными карточками. Заголовки «Имя», «Сделок», «В работе» кликабельны — по ним идёт сортировка.
Список компаний. Таблица со столбцами: Название (иконка здания + адрес), ИНН, Телефон, Сайт, Сделок (открытых), Оборот, кастомные поля и меню действий. Сортировка — по названию, числу сделок и обороту.
Панель массовых операций (bulk bar). Появляется, когда отмечены строки контактов галочками: показывает счётчик выбранных, выпадающий список «Ответственный…» для массового переназначения и кнопку «В корзину». Есть чекбокс «выбрать все» в шапке таблицы.
Карточка контакта (drawer). В шапке — аватар, имя, должность и компания, кнопки «Редактировать» и «Закрыть». Вкладки: Профиль (компания-ссылка, телефон, email, ответственный, дата «в базе с», кастомные поля, плюс плитки «Сделок в работе» и «Выиграно»); Сделки · N (все сделки контакта списком с этапом и суммой); Задачи · N (собственные задачи контакта и задачи по его сделкам, N — число невыполненных); Документы · N (договоры и счета по сделкам контакта деревом); История (лента изменений).
Карточка компании (drawer). В шапке — иконка здания, название и ИНН. Вкладки: Обзор (ИНН, телефон, сайт, адрес, статус клиентского Портала, кастомные поля, плитки «Сделок в работе» и «Оплачено всего», а также список контактов-сотрудников компании с кнопкой «+ Контакт»); Сделки · N (со сводкой «Выиграно на сумму»); Задачи · N (задачи компании, её сделок и её сотрудников); Документы · N (все документы компании деревом + кнопка «Документ» и переход в раздел «Документы»); Финансы · N (плитки «Оплачено»/«Ожидается по плану», список счетов и список платежей); История.
Меню действий (три точки). У контакта: «Открыть», «Новая сделка», «Редактировать», «Удалить». У компании: «Открыть карточку», «Новая сделка», «Документы компании», «Редактировать», «Удалить». При удалении система предупреждает, сколько связанных сделок, контактов и документов затронуто, и переносит запись в Корзину (не удаляет безвозвратно).
Как пользоваться — пошагово
- Открыть раздел. В левом меню выберите «Контрагенты». По умолчанию открыта вкладка «Контакты».
- Создать компанию. Перейдите на вкладку «Компании», нажмите «+ Компания». Заполните «Название» (обязательно), при желании ИНН, телефон, сайт, адрес и кастомные поля (Сегмент, число сотрудников, признак NDA). Нажмите «Создать».
- Создать контакт и связать с компанией. На вкладке «Контакты» нажмите «+ Контакт». Введите имя (обязательно), должность, телефон, email, в поле «Компания» выберите ранее созданную организацию и назначьте ответственного. Если такой контакт уже похоже существует (совпал телефон, email или имя), система покажет предупреждение и предложит открыть найденного или «Создать всё равно».
- Открыть карточку. Кликните по строке контакта или компании — справа выедет карточка. Переключайте вкладки, чтобы увидеть сделки, задачи, документы, финансы и историю.
- Добавить сотрудника из карточки компании. На вкладке «Обзор» карточки компании нажмите «+ Контакт» — новый человек сразу привяжется к этой организации.
- Запустить сделку. В карточке или в меню «три точки» нажмите «Новая сделка» — контакт и его компания подставятся автоматически.
- Посмотреть документы по контрагенту. Откройте вкладку «Документы»: договоры показаны сверху, под каждым с отступом — его дочерние документы (допсоглашения, счета, акты). Клик по документу открывает его карточку.
- Массовые действия. Отметьте несколько контактов галочками — в появившейся панели назначьте им общего ответственного или отправьте в корзину.
- Импорт и экспорт. Кнопкой «Импорт» загрузите список из файла, иконкой скачивания выгрузите текущий список в CSV.
Взаимосвязи
- Связан со Сделками: каждая сделка ссылается на контакт (
contactId) и компанию (companyId); в карточке контрагента считаются открытые сделки и их сумма, есть кнопка «Новая сделка». - Связан с Документами: договоры, допсоглашения, счета и акты привязаны к компании и сделке; карточка собирает их деревом «Контрагент → Договор → дочерние документы».
- Связан с Задачами: в карточке видны как прямые задачи по контрагенту, так и унаследованные — по его сделкам (а у компании ещё и по её сотрудникам).
- Связан с Финансами: оборот компании и вкладка «Финансы» строятся из платежей и счетов (
payments,invoices) с привязкой поcompanyId. - Связан с клиентским Порталом: у компании отображается статус доступа к порталу и ссылка на него, если он включён.
- Ведёт Историю изменений: правки полей контакта и компании фиксируются в ленте (вкладка «История»).
- Удаление отправляет запись в Корзину, откуда её можно восстановить вместе со связями.
Под капотом (технически)
Раздел работает с несколькими коллекциями общего состояния. Контакты и компании хранятся отдельно и связываются полем companyId. Документы образуют иерархию через поле parentId (дочерний документ ссылается на родительский договор), а к контрагенту привязываются через companyId и dealId. Данные фронтенда (vanilla JS) синхронизируются с бэкендом (Node + SQLite) через сохранение общего состояния; логика раздела — в функции Views.contacts и карточках openContactDrawer / openCompanyDrawer.
Коллекция contacts (контакты-люди):
| Поле | Тип | Описание |
|---|---|---|
| id | строка | Уникальный идентификатор контакта. |
| name | строка | ФИО. Обязательное поле. |
| position | строка | Должность. |
| companyId | строка / null | Ссылка на компанию, к которой привязан контакт. |
| phone | строка | Телефон (в поиске дубликатов сравниваются последние 10 цифр). |
| строка | Электронная почта. | |
| ownerId | строка | Ответственный менеджер (ссылка на пользователя). |
| createdAt | дата | Дата добавления в базу («В базе с»). |
| custom | объект | Значения кастомных полей (например, Telegram, День рождения). |
Коллекция companies (компании-организации):
| Поле | Тип | Описание |
|---|---|---|
| id | строка | Уникальный идентификатор компании. |
| name | строка | Название организации. Обязательное поле. |
| inn | строка | ИНН. |
| phone | строка | Телефон. |
| site | строка | Сайт. |
| address | строка | Адрес. |
| custom | объект | Кастомные поля: Сегмент (SMB/Enterprise/Госсектор), число сотрудников, признак подписанного NDA. |
Коллекция documents (документы контрагента, образуют дерево связей):
| Поле | Тип | Описание |
|---|---|---|
| id | строка | Идентификатор документа. |
| type | строка | Тип: договор (contract), доп. соглашение (amendment), счёт (invoice), акт (act), КП (offer), NDA (nda). |
| number | строка | Номер документа. |
| title | строка | Название/предмет документа. |
| companyId | строка | Компания-адресат документа. |
| dealId | строка | Сделка, к которой относится документ. |
| parentId | строка | Ссылка на родительский договор (для дочерних документов — счетов, допсоглашений). |
| amount | число | Сумма документа. |
| date | дата | Дата документа. |
| status | строка | Статус: черновик, на согласовании, подписан, расторгнут. |
| ownerId | строка | Ответственный за документ. |
Модель связей. Контакт принадлежит компании через companyId (один-ко-многим: у компании много контактов). Сделки ссылаются и на контакт, и на компанию, поэтому карточка контрагента агрегирует сделки, а через них — задачи и документы. Документы выстраиваются деревом: сначала договоры компании, под каждым — его дочерние документы по parentId, затем одиночные. Финансовые показатели компании (оборот, «Оплачено всего», вкладка «Финансы») собираются из платежей и счетов по companyId. Смежные коллекции: deals (сделки), tasks (задачи), payments и invoices (финансы), history (лента изменений), customFields (описания кастомных полей), trash (корзина для восстановления удалённых записей).
Проекты
«Проекты» — это верхний уровень планирования в «АэроБоксе»: годовые планы и инициативы, внутри которых вложены под-проекты, задачи и сделки. Раздел показывает всё дерево работ, финансы по каждому проекту, диаграмму Ганта на год и аналитику загрузки команды, а группы проектов можно открыть заказчику по ссылке-паролю только для просмотра.

Назначение
Раздел отвечает на вопрос «что мы делаем в этом году и как продвигаемся». Крупная цель (например, «Импортозамещение 2026») заводится как проект верхнего уровня, разбивается на под-проекты-этапы, а к любому уровню привязываются конкретные задачи и сделки. Прогресс, деньги и сроки считаются автоматически по вложенному содержимому, поэтому руководитель видит картину сверху вниз, не собирая её вручную.
Что делает
- Строит многоуровневое дерево: проект → под-проекты → задачи и сделки, с визуальными рельсами-коннекторами и разворачиванием веток.
- Группирует проекты верхнего уровня по году начала (заголовки «2026 год», «Без срока»).
- Считает прогресс проекта в процентах — по доле выполненных задач во всём его поддереве.
- Суммирует «портфель» — деньги связанных сделок по всему поддереву проекта.
- Помечает риск срыва: у проекта не статус «Завершён», а дата завершения уже в прошлом.
- Ведёт вехи (milestones) — ключевые точки проекта с названием, датой и отметкой выполнения; они же появляются маркерами на таймлайне.
- Рисует диаграмму Ганта на выбранный год с полосами проектов, заливкой прогресса и линией «сегодня».
- Даёт аналитику: бюджет / реализовано / оплачено по каждому проекту, средний прогресс, список рисков и нагрузку по ответственным.
- Выгружает план проектов в CSV.
- Собирает проекты в группы и делится ими по публичной ссылке с паролем — только для чтения.
Основные экраны и элементы
Вверху — переключатель из четырёх режимов и кнопка «+ Проект» (в режиме «Группы» она превращается в «+ Группа»). Под переключателем в режимах «План на год» и «Таймлайн» показаны четыре плитки-показателя: Проектов (всего и сколько в работе), Завершено, В портфеле (сумма связанных сделок), Риск срыва (сколько проектов с просроченным дедлайном).
План на год (outline) — основной режим. Корневые проекты сгруппированы по году начала. Каждая строка проекта (projectRowHTML) содержит: треугольник-каретку для разворачивания ветки, цветную точку проекта, название, строку сроков «начало — завершение» (просроченная дата завершения подсвечена красным) с суммой портфеля и счётчиком «выполнено / всего задач», полоску прогресса с процентом, пилюлю статуса, аватар ответственного и кнопку действий «…». Развёрнутая ветка показывает под-проекты (рекурсивно), затем задачи с чекбоксом-галочкой, иконкой типа, названием, пилюлей срока и аватаром, затем сделки (иконка, название, этап, сумма), и в конце строку «+ Добавить в проект» (до 3 уровней вложенности).
Таймлайн — диаграмма Ганта на один год. Переключается год стрелками «‹ / ›». Сверху шкала месяцев (янв…дек). Каждая строка — полоса проекта от даты начала до даты завершения в цвете проекта, внутри — заливка по проценту прогресса и подпись «%». На полосе видны маркеры вех за этот год. Вертикальная линия «сегодня» показывает текущий день (если открыт текущий год). Показываются корневые проекты и их прямые под-проекты, пересекающие выбранный год. Клик по строке открывает карточку проекта.
Аналитика — четыре плитки (общий бюджет, реализовано, оплачено, средний прогресс), таблица «Финансы по проектам» (проект, статус, бюджет, реализовано, оплачено, полоса прогресса) с кнопкой «Экспорт CSV», блок «Риск срыва сроков» со списком просроченных проектов и числом дней просрочки, и блок «Нагрузка по ответственным» — сколько активных проектов и задач у каждого сотрудника, полосами.
Группы — список групп проектов для публичного шаринга. У строки группы: название с пилюлей «Открыта / Черновик» и, если задан, «🔒 пароль», число проектов и первые их имена, кнопки «Поделиться», «Изменить состав» и «Удалить». (Подробно механика публичной витрины раскрыта в разделе «Витрина».)
Карточка проекта (боковая панель) открывается кликом по проекту. В шапке — цветная точка, название, кнопки «Редактировать / Удалить / Закрыть», пилюли статуса, сроков и прогресса, ссылка на родительский проект. Ниже — вкладки: Задачи, Сделки, Вехи, Под-проекты (с счётчиками). В теле — блок «Цель», свойства (ответственный, сумма портфеля) и содержимое активной вкладки. На вкладке «Вехи» можно добавить веху (название + дата), отметить её выполненной или удалить. Внизу — кнопки «Задача в проект» и «Под-проект».
Форма проекта (создание / редактирование): название, цель, даты начала и завершения, статус, ответственный, поле «Входит в проект» (для вложенности) и выбор цвета из палитры. Статусы проекта (projectStatusMeta): План (planned), В работе (active), Пауза (paused), Завершён (done).
Как пользоваться — пошагово
- Откройте группу «Работа» → раздел «Проекты».
- Нажмите «+ Проект», введите название, цель и сроки, выберите статус, ответственного и цвет. Чтобы сделать под-проект — в поле «Входит в проект» выберите родителя. Сохраните.
- В режиме «План на год» разверните проект кареткой (треугольником) и через строку «+ Добавить в проект» заводите под-проекты, задачи и сделки — они автоматически свяжутся с этим проектом.
- Откройте карточку проекта кликом по строке. На вкладке «Вехи» добавьте ключевые точки (название + дата) — они появятся маркерами на таймлайне.
- Отмечайте задачи выполненными прямо в дереве или в карточке — прогресс проекта пересчитается сам.
- Переключитесь на «Таймлайн», чтобы увидеть проекты полосами Ганта; стрелками смените год.
- Откройте «Аналитику» для финансов, рисков срыва и нагрузки; при необходимости выгрузите план в CSV.
- Чтобы показать план заказчику — перейдите в «Группы», создайте группу, выберите проекты, затем «Поделиться»: задайте пароль и включите доступ, скопируйте ссылку.
Взаимосвязи
- Задачи — через
#tasks: у задачи полеprojectIdсвязывает её с проектом; выполненные задации формируют прогресс проекта. - Сделки — через
#deals: у сделки полеprojectIdдобавляет её сумму в «портфель» проекта; аналитика считает бюджет, реализованное (выигранные сделки) и оплаченное. - Финансы — через
#payments: «оплачено» берётся из поступлений (income, status «done») по сделкам проекта. - Контакты и компании — косвенно через связанные сделки.
- Аналитика и загрузка команды — через
#users: нагрузка считается по ответственным за проекты и задачи. - Публичная витрина — через
#share: группы проектов открываются по ссылке/s/<токен>с паролем, только для чтения.
Под капотом (технически)
Основной код — Views.projects и связанные функции в js/views2.js. Данные хранятся в коллекции projects (плоский список со ссылкой на родителя через parentId), синхронизируются через /api/state. Прогресс, суммы и поддерево считаются на лету: projectSubtree, projectProgress, projectAmount, projectFinance. Группы проектов (коллекция projectGroups) приходят с сервера уже без пароля и меняются только через отдельные эндпоинты /api/groups, а не через общий стейт.
| Поле | Тип | Описание |
|---|---|---|
| id | string | Идентификатор проекта. |
| name | string | Название проекта. |
| goal | string | Цель — что должно быть достигнуто к завершению. |
| start | date (ISO) | Дата начала. Год начала используется для группировки и размещения на таймлайне. |
| end | date (ISO) | Дата завершения. Прошедшая дата при незавершённом проекте = риск срыва. |
| status | enum | planned / active / paused / done (План / В работе / Пауза / Завершён). |
| ownerId | string | Ответственный за проект (ссылка на users). |
| parentId | string / null | Родительский проект. null = проект верхнего уровня. |
| color | string | Цвет проекта (точка, полоса Ганта, прогресс). |
| milestones | array | Вехи проекта: объекты с полями id, title (название вехи), date, done. |
| createdAt | date (ISO) | Дата создания записи. |
Группа проектов (коллекция projectGroups) содержит поля: id, name, description, projectIds (список проектов в группе), enabled (доступ по ссылке включён), hasPassword (задан ли пароль), token (часть публичной ссылки). Подробнее — в разделе «Витрина».
Задачи
«Задачи» — операционный список дел команды: звонки, письма, встречи и обычные задачи со сроками, приоритетами, ответственными и соисполнителями. Раздел показывает работу в четырёх режимах (список, канбан, месяц, неделя), подсвечивает просрочку, считает нагрузку команды и позволяет массово менять сроки, ответственных и приоритеты.

Назначение
Раздел закрывает ежедневную операционку: что и когда каждый сотрудник должен сделать. В отличие от «Проектов» (стратегический уровень на год), «Задачи» — это уровень конкретных действий с точными сроками и напоминаниями. Задачи могут стоять сами по себе или быть привязаны к сделке, заявке, контакту, компании и проекту, поэтому раздел работает и как личный планировщик, и как общий пульт загрузки команды.
Что делает
- Хранит задачи четырёх типов (
taskTypeIcon): Звонок, Письмо, Встреча, Задача — с иконками. - Поддерживает приоритеты (
taskPriorityMeta): Срочный, Важный, Обычный — с цветными метками. - Показывает задачи в четырёх режимах: список с группировкой по срокам, канбан по срокам с drag-and-drop, календарь на месяц и на неделю.
- Автоматически группирует список: «Просроченные», «Сегодня», «Предстоящие», «Выполненные».
- Подсвечивает просрочку (срок в прошлом и задача не выполнена) красным.
- Фильтрует по ответственному («Мои / Наблюдаю / Все» и выбор сотрудника), по статусу (активные / все / выполненные), по типу и приоритету; сортирует по «приоритет + срок», приоритету, сроку или добавлению.
- Показывает сводку «Нагрузка команды» — сколько активных и просроченных задач у каждого.
- Даёт массовые действия над выбранными: выполнить, назначить ответственного, сменить приоритет, отложить срок, удалить в корзину.
- Ведёт повторяющиеся задачи (ежедневно / еженедельно / ежемесячно) — при выполнении создаётся следующая копия.
- Хранит напоминания (в момент срока, за 15 минут, за час, за день).
- В карточке задачи держит описание, подзадачи, чек-лист, комментарии, файлы, историю изменений, оценку и факт трудозатрат.
- Даёт быстрые действия по типу: «Позвонить» (tel:), «Написать письмо» (переход в почту), «В календарь» (для встреч).
Основные экраны и элементы
В панели вверху — переключатель режимов (Канбан / Список / Месяц / Неделя), контрол ответственного (Мои / Наблюдаю / Все плюс выпадающий выбор сотрудника), сегмент статуса (Активные / Все / Выполненные), кнопка «Фильтры» (тип, приоритет, сортировка) и кнопка «+ Задача».
Список — задачи сгруппированы по срокам: «Просроченные», «Сегодня», «Предстоящие», «Выполненные», с счётчиком в каждой группе. Строка задачи (taskRowHTML) содержит: чекбокс выбора для массовых действий, цветную метку приоритета, чекбокс-галочку выполнения, иконку типа, название (со значком повтора, если задача повторяющаяся), под-строку с счётчиками чек-листа/комментариев/файлов и соисполнителей, ярлык связанной сделки, пилюлю срока (красную при просрочке, янтарную на сегодня), аватар ответственного и кнопку действий «…». Для режима «Мои» есть сводка «Дайджест» и подсказка «У команды ещё N активных задач».
Канбан — колонки по срокам: «Просрочено», «Сегодня», «Завтра», «Эта неделя», «Позже», «Выполнено». Карточку можно перетащить в другую колонку — срок изменится автоматически (перенос в «Выполнено» отмечает задачу выполненной; в «Просрочено» перетащить нельзя). На карточке — галочка выполнения, метка приоритета, значок повтора, название, связанная сделка, иконка типа, пилюля срока, число соисполнителей и аватар.
Месяц / Неделя — календарная сетка (недели с понедельника). Задачи-«чипы» раскрашены по типу и статусу (выполненные и просроченные различаются). Чип можно перетащить на другой день — срок изменится; клик по пустому дню создаёт задачу на эту дату. В режиме «Месяц» показываются первые 3 задачи в дне и «ещё N…». Навигация — «назад / вперёд / Сегодня».
Сводка «Нагрузка команды» (в режиме «Все») — по каждому сотруднику полоса с числом активных задач и отметкой просроченных.
Карточка задачи (боковая панель) открывается кликом по задаче. Вкладки: Основное, Комментарии, Файлы, История. На «Основном» — тип, приоритет, срок с кнопкой «Отложить», повтор, напоминание, ответственный, соисполнители, связанные сделка / заявка / проект / контакт / компания, оценка и факт трудозатрат в минутах, описание, подзадачи (со своими сроками и исполнителями) и чек-лист с прогрессом.
Форма новой задачи: что нужно сделать, тип, приоритет, срок и время, напоминание, повтор, сделка, ответственный, проект, соисполнители и описание.
Как пользоваться — пошагово
- Откройте группу «Работа» → раздел «Задачи».
- Нажмите «+ Задача», укажите, что нужно сделать, выберите тип и приоритет, задайте срок (и время, если нужно напоминание).
- При необходимости привяжите сделку и проект, назначьте ответственного и добавьте соисполнителей, затем «Поставить задачу».
- Переключателем «Мои / Наблюдаю / Все» и выбором сотрудника отфильтруйте, чьи задачи видны.
- Отмечайте выполнение галочкой в строке; повторяющаяся задача сразу породит следующую копию.
- Для перепланирования перетаскивайте карточки в «Канбане» между колонками или чипы в календаре на другой день — срок обновится сам.
- Чтобы обработать много задач разом — отметьте их чекбоксами выбора и на появившейся панели выполните / назначьте / смените приоритет / отложите / удалите.
- Откройте карточку задачи, чтобы вести чек-лист, подзадачи, комментарии, файлы, трудозатраты и посмотреть историю; кнопкой «Отложить» переносите срок.
Взаимосвязи
- Проекты — через
#projects: полеprojectIdпривязывает задачу к проекту и учитывает её в прогрессе проекта. - Сделки — через
#deals: полеdealIdсвязывает задачу со сделкой; из сделки задача наследует проект, контакт и компанию. - Заявки — через
#leads: полеleadIdсвязывает задачу с заявкой, задача видна в её карточке. - Контакты и компании — через
#contacts: поляcontactId/companyIdи быстрые действия «Позвонить» / «Написать письмо». - Почта — через
#mail: быстрое действие типа «Письмо» открывает форму письма адресату. - Календарь (CalDAV) — через встречи: быстрое действие «В календарь» отправляет встречу во внешний календарь, если интеграция включена.
- Пользователи — через
#users: ответственный и соисполнители (наблюдатели) получают уведомления и видят задачу в «Наблюдаю».
Под капотом (технически)
Основной код — Views.tasks и связанные функции в js/views.js (мета-данные типов и иконок — в js/ui.js). Данные — в коллекции tasks, синхронизируются через /api/state. Функция taskBackfill дозаполняет недостающие поля у старых записей (приоритет, массивы наблюдателей, истории, подзадач, чек-листа, комментариев, файлов). Выполнение и повтор обрабатывают toggleTaskDone и spawnNextTask, перенос срока — snoozeTask.
| Поле | Тип | Описание |
|---|---|---|
| id | string | Идентификатор задачи. |
| title | string | Название — что нужно сделать. |
| type | enum | call / email / meeting / task (Звонок / Письмо / Встреча / Задача). |
| priority | enum | urgent / high / normal (Срочный / Важный / Обычный). |
| due | date (ISO) | Срок. Прошедший срок при невыполненной задаче = просрочка. |
| dueTime | string / null | Время срока (для точного напоминания). |
| recur | enum / null | Повтор: daily / weekly / monthly (каждый день / неделю / месяц). |
| remindOffset | number / null | За сколько минут до срока напомнить (0 = в момент срока). |
| remindAt | timestamp | Момент напоминания (вычисляется из срока, времени и offset). |
| done | boolean | Задача выполнена. |
| ownerId | string | Ответственный (ссылка на users). |
| watchers | array | Соисполнители / наблюдатели (id пользователей). |
| projectId | string / null | Связанный проект. |
| dealId | string / null | Связанная сделка. |
| leadId | string / null | Связанная заявка. |
| contactId | string / null | Связанный контакт. |
| companyId | string / null | Связанная компания. |
| description | string | Описание и детали. |
| subtasks | array | Подзадачи (title, due, ownerId, done). |
| checklist | array | Пункты чек-листа (text, done). |
| comments | array | Комментарии к задаче. |
| files | array | Прикреплённые файлы. |
| history | array | История изменений (кто, когда, что сделал). |
| estimateMin / spentMin | number | Оценка и фактические трудозатраты в минутах. |
Документы
Единое хранилище договоров, доп. соглашений, счетов, актов, коммерческих предложений и NDA. Документы связаны в дерево «Контрагент → Договор → ДС / счета / акты», проходят согласование по статусам и печатаются готовыми формами (счёт, КП).

Назначение
Раздел «Документы» держит в одном месте всю договорную работу компании. Каждый документ привязывается к контрагенту и (по желанию) к сделке, имеет тип, номер, сумму, дату, ответственного и статус согласования. Договоры выступают «корнем»: к ним подшиваются доп. соглашения (которые меняют сумму договора), счета и акты — так формируется наглядная иерархия, а не плоский список файлов.
Что делает
- Хранит документы шести типов: Договор, Доп. соглашение, Счёт, Акт, КП (коммерческое предложение), NDA.
- Ведёт статусы согласования: Черновик → На согласовании → Подписан, плюс отдельный статус Расторгнут.
- Строит дерево: под договором показываются его доп. соглашения, счета и акты со смещением-отступом (значок «↳»).
- Считает «эффективную» сумму договора: базовая сумма плюс дельты подписанных доп. соглашений (можно с минусом).
- Показывает четыре карточки-сводки: всего документов, на согласовании, подписано, сумма по подписанным договорам.
- Фильтрует список по типу (чипы), по статусу (клик по карточке «На согласовании») и по конкретному контрагенту (переход из карточки компании).
- Печатает готовые формы для счёта и коммерческого предложения (позиции, итоги, сумма прописью, подписи, М. П.).
- Позволяет создавать, редактировать, дублировать документ и удалять его в корзину — вместе со всем связанным деревом.
- Отражает решение клиента по документу: пометки «клиент ✓» / «клиент ✕» с комментарием.
Основные экраны и элементы
Карточки-сводки сверху: «Всего документов» (с разбивкой на договоры и КП), «На согласовании» (кликабельная — включает фильтр по статусу), «Подписано», «Сумма по договорам» (по подписанным договорам). Панель чипов — «Все» и по одному чипу на каждый тип документа со счётчиком; кнопка «Документ» открывает форму создания. Таблица с колонками: Документ (иконка-формат PDF/DOCX/XLSX, название, номер, размер), Тип, Контрагент, Сумма, Дата, Статус, Ответственный и кнопки действий. Быстрые кнопки в строке: «Согласовать» (для черновика), «Подписан» (для документа на согласовании) и меню «…». Карточка документа (выезжающая панель) показывает свойства, структуру договора, шкалу согласования и кнопки «Печать/Скачать» и смены статуса. При активном фильтре по компании сверху появляется плашка с кнопкой сброса.
Как пользоваться — пошагово
- Откройте раздел «Документы» в левом меню.
- Нажмите «Документ» — откроется форма. Выберите тип (по умолчанию «Договор»), укажите номер и название.
- Для договора/счёта/акта/КП выберите контрагента и, при необходимости, сделку; задайте сумму, дату, формат (PDF/DOCX/XLSX) и ответственного.
- Для доп. соглашения выберите родительский договор в поле «К договору» — контрагент и сделка унаследуются от него, а сумма ДС (можно с минусом) изменит сумму договора.
- Нажмите «Создать документ» — он появится в списке со статусом «Черновик».
- Отправьте документ «На согласование» (кнопка в строке или в карточке), затем отметьте «Подписан», когда стороны подпишут.
- Внутри договора кнопками «Доп. соглашение» / «Счёт» / «Акт» добавьте связанные документы — они автоматически подошьются к договору.
- Для счёта или КП откройте меню «…» → «Печать счёта» / «Печать КП» и распечатайте или сохраните форму.
- Ненужный документ удалите через меню «…» → «Удалить»: он (и всё его дерево) отправится в корзину и восстановится целиком.
Взаимосвязи
- Контрагенты через #contacts: каждый документ привязан к компании-контрагенту; из карточки контрагента можно перейти к «Документам компании» (фильтр по этой компании).
- Сделки через #deals: документ можно связать со сделкой; смена статуса и каскадное расторжение ДС записываются в ленту активности сделки, а состав сделки подставляется в позиции печатных форм.
- Финансы через #finance: тип «Счёт» использует ту же печатную форму, что и счета из раздела «Финансы»; счета и акты подшиваются к договору.
- Товары через #products: позиции печатных счёта и КП берутся из состава связанной сделки — наименование, артикул, количество и цена подставляются из каталога товаров.
- Корзина: удалённые документы (и связанные с ними ДС/счета/акты) перемещаются в корзину и восстанавливаются деревом.
Под капотом (технически)
Экран собирается функцией Views.docs (файл js/views.js). Данные лежат в коллекции documents и синхронизируются со всем остальным состоянием через /api/state.
| Поле | Назначение |
|---|---|
| id | Идентификатор документа |
| type | Тип: contract, amendment, invoice, act, offer, nda |
| number | Номер документа |
| title | Название |
| status | Статус: draft, review, signed, terminated |
| companyId | Ссылка на контрагента (для ДС наследуется от договора) |
| dealId | Ссылка на связанную сделку (необязательно) |
| parentId | Ссылка на родительский договор (для ДС, счетов, актов) |
| amount | Сумма; у ДС — дельта к сумме договора (может быть отрицательной) |
| date | Дата документа |
| ext | Формат файла: pdf, docx, xlsx |
| size | Размер файла (текст) |
| ownerId | Ответственный сотрудник |
| clientDecision / clientComment | Решение клиента (approved/rejected) и комментарий |
Иерархия и суммы. Функция docChildren находит дочерние документы по parentId, а contractEffectiveAmount прибавляет к базовой сумме договора дельты подписанных доп. соглашений. Действуют зависимости: ДС можно подписать только после подписания родительского договора; расторжение договора каскадно расторгает его подписанные ДС; удаление договора уводит в корзину всё дерево целиком.
Хранение файлов. Настоящие файлы (не демо) загружаются через маршрут POST /api/files: тело содержит имя, MIME-тип и содержимое в base64 (ограничение размера действует на сервере). Сервер декодирует содержимое и сохраняет его на диск отдельным файлом, а метаданные (имя, тип, размер, владелец) — в служебной таблице files; ответ возвращает сохранённую запись. Скачивание — по GET /api/files/<id>: сервер читает содержимое с диска и отдаёт его как вложение с корректным именем и типом. Загрузка каждого файла фиксируется в журнале аудита. Печатные формы счёта и КП генерируются на клиенте (функции printInvoice, printOffer, printLines) и открываются через общий механизм печати.
Финансы
Управление деньгами компании: фактические и плановые платежи, счета на оплату, отчёт о движении денежных средств (ДДС) и справочники статей и счетов учёта. Раздел считает остаток на счетах, поступления за месяц и ожидаемые деньги, связывая каждую операцию со сделкой и контрагентом.

Назначение
Раздел «Финансы» отвечает за учёт денег. Он фиксирует приходы и расходы (платежи), выставленные клиентам счета на оплату, показывает движение денег по месяцам и хранит справочники — статьи доходов/расходов и счета учёта (расчётные счета, касса). Показатели наверху дают моментальный срез финансового состояния, а операции связаны со сделками и контрагентами, поэтому деньги видно в контексте продаж.
Что делает
- Ведёт платежи — приходы и расходы, фактические («Проведён») и плановые («План»); плановый платёж можно «Провести» одной кнопкой.
- Ведёт счета на оплату со статусами «Черновик / Отправлен / Оплачен» и подсветкой просрочки по числу дней.
- При отметке счёта оплаченным автоматически создаёт приходный платёж на его сумму.
- Строит отчёт ДДС: столбчатую диаграмму поступлений и выплат по месяцам и сводную таблицу «Приход / Расход / Сальдо».
- Хранит справочники статей (поступлений и выплат) и счетов учёта; статьи и счета можно создавать, переименовывать и удалять.
- Считает четыре показателя: остаток на счетах, поступления за текущий месяц, ожидаемые поступления за 7 дней, число неоплаченных счетов и их сумма.
- Экспортирует платежи и счета в CSV (совместимо с Excel).
Основные экраны и элементы
Карточки-показатели сверху: «Остаток на счетах» (проведённые приходы минус расходы), «Поступления за месяц», «Ожидается 7 дней» (плановые приходы) и «Счета без оплаты» (кликабельная — переводит на вкладку «Счета»). Под ними субнавигация из четырёх вкладок:
- Платежи — таблица операций: дата, тип (Приход/Расход), сумма, статья, счёт, сделка, назначение, статус; кнопка «Провести» у плановых, экспорт CSV, кнопка «Платёж».
- Счета — таблица счетов на оплату с сортировкой (по умолчанию неоплаченные сверху): номер, дата, плательщик, сделка, сумма, статус; кнопки «Отметить оплату» и меню «…» (печать счёта, переход к сделке/контрагенту).
- Отчёт ДДС — диаграмма движения денег по месяцам и сводная таблица с сальдо.
- Статьи — три карточки-справочника: статьи поступлений, статьи выплат и счета учёта (с числом привязанных платежей).
Клик по строке платежа или счёта открывает карточку (выезжающую панель) с полной информацией, ссылками на сделку/контрагента и кнопками действий (провести, отметить оплату, печать, удалить).
Как пользоваться — пошагово
- Откройте раздел «Финансы» — по умолчанию активна вкладка «Платежи».
- Чтобы записать деньги, нажмите «Платёж»: выберите тип (Приход/Расход), сумму, дату, статус (Проведён/Плановый), статью, счёт учёта, при желании сделку и назначение — нажмите «Добавить».
- Плановый платёж, когда деньги пришли, отметьте кнопкой «Провести» в строке или в его карточке.
- Перейдите на вкладку «Счета» и нажмите «Счёт», чтобы выставить счёт клиенту (номер подставляется автоматически).
- Когда счёт оплачен, нажмите «Отметить оплату» — статус станет «Оплачен», а система сама создаст приходный платёж на сумму счёта.
- Распечатайте счёт из меню «…» → «Печать счёта».
- Откройте вкладку «Отчёт ДДС», чтобы увидеть помесячную динамику поступлений и выплат и сальдо.
- На вкладке «Статьи» заведите нужные статьи доходов/расходов и счета учёта; при удалении статьи с платежами система попросит перенести их в другую статью.
- При необходимости выгрузите платежи или счета в CSV кнопкой экспорта.
Взаимосвязи
- Сделки через #deals: платежи и счета можно привязать к сделке — так видно, какие деньги относятся к какой продаже; из карточки платежа/счёта есть переход к сделке.
- Контрагенты через #contacts: плательщиком счёта выступает компания-контрагент; из карточки счёта можно открыть контрагента.
- Документы через #docs: счёт на оплату использует ту же печатную форму, что и документ типа «Счёт»; счета и акты подшиваются к договорам.
- Товары через #products: позиции печатного счёта берутся из состава связанной сделки (наименования и цены товаров из каталога).
- Аналитика через #analytics: проведённые платежи формируют фактические денежные потоки, которые попадают в отчёты и показатели.
- Корзина: удалённые платежи и счета уходят в корзину; удаление платежа влияет на остатки и отчёт ДДС.
Под капотом (технически)
Экран собирается функцией Views.finance (файл js/views.js) и использует четыре коллекции состояния, синхронизируемые через /api/state.
| Коллекция | Ключевые поля |
|---|---|
| payments | id, date, kind (income/expense), amount, status (done/planned), itemId (статья), accountId (счёт), dealId, companyId, note |
| invoices | id, number, date, amount, status (draft/sent/paid), companyId (плательщик), dealId |
| accounts | id, name, balance — счета учёта (расчётный счёт, касса) |
| cashflowItems | id, name, kind (income/expense) — статьи доходов и расходов |
Как считаются показатели. Остаток на счетах — сумма проведённых приходов минус проведённые расходы; «Поступления за месяц» и «Ожидается 7 дней» фильтруют платежи по дате и статусу; «Счета без оплаты» суммирует счета со статусом ≠ paid. Просрочка счёта определяется числом дней от даты счёта до сегодня и параметром сценария просрочки. Функция markInvoicePaid переводит счёт в «Оплачен» и добавляет в payments приходную запись на его сумму. Отчёт ДДС группирует проведённые платежи по месяцам (диаграмма и таблица с сальдо). Удаление платежа или счёта проходит через корзину (moveToTrash). Печать счёта выполняется общей клиентской функцией printInvoice (позиции, итог, сумма прописью, подписи, М. П.), поэтому счета из «Финансов» и документы типа «Счёт» печатаются единообразно. Отдельного хранения бинарных файлов у финансовых операций нет — файлы (при необходимости) загружаются общим механизмом /api/files, описанным в разделе «Документы».
Бизнес-процессы
Исполняемый движок повторяющихся процедур компании: каждый процесс описан наглядной блок-схемой, а АэроБокс умеет «проиграть» её на реальной заявке или сделке — создавая задачи, двигая сделку по воронке, выставляя счета и спрашивая менеджера на развилках.

Назначение
Раздел закрывает вопрос «как у нас положено делать» и превращает регламент в живой сценарий. Вместо инструкции в вики процесс становится схемой, которую можно запустить по конкретному объекту CRM: система сама выполняет технические шаги (задачи, метки, счета, конвертация заявки), а человека спрашивает только на смысловых развилках («Дозвонились?», «Есть замечания?»). Так исключаются «потерянные» заявки: у каждой ветки есть завершение и ответственный.
Что делает
- Хранит библиотеку процессов компании (в демо — «Обработка входящей заявки», «Согласование и подписание договора», «Обработка пропущенного звонка»).
- Рисует блок-схему процесса: узлы «старт», «действие», «условие», «финал» и переходы между ними со стрелками и подписями «да/нет».
- Даёт два режима прогона: Симуляция — безопасный прогон без последствий (развилки решаются по заданной вероятности), и Запуск на заявке/сделке — реальное выполнение с эффектами в CRM.
- При реальном запуске выполняет действия узлов: создаёт задачи, добавляет метки, меняет ответственного, переносит сделку на этап, выставляет счёт, меняет статус заявки, конвертирует заявку в контакт+сделку, пишет в ленту активности.
- На развилках-условиях останавливается и спрашивает менеджера кнопками «Да / Нет».
- Пишет журнал запусков (processRuns): цель, время, число шагов и перечень реальных эффектов; ведёт счётчик запусков и историю по каждому процессу.
- Позволяет создавать, редактировать и дублировать процессы (при наличии прав на раздел).
Основные экраны и элементы
Реестр процессов — карточки с названием, числом шагов и развилок, владельцем, статусом (Активен / Черновик) и счётчиком запусков. Переключатель вкладок вверху ведёт на «Системные сценарии» (см. раздел «Автоматизация»). Страница процесса состоит из блоков: плитки статистики (статус, запусков, среднее время, размер схемы); блок-схема — SVG-диаграмма, где ▢ — действие, ◇ — условие, капсула — старт/финал; панель «Выполнение» с живым журналом шагов (по узлу в секунду) и кнопками ответа на развилках; блок «Последние запуски». Кнопки на верхней панели: «Запустить на заявке/сделке», «Симуляция», «Сброс», «Редактировать», «Дублировать».
Как пользоваться — пошагово
- Откройте раздел «Бизнес-процессы» и выберите карточку нужного процесса — откроется его схема.
- Чтобы понять логику без риска, нажмите «Симуляция»: движок пойдёт по схеме сам, а на развилках выберет ветку по заложенной вероятности и пояснит выбор в журнале.
- Для боевого запуска нажмите «Запустить на заявке» (или «на сделке»). В окне выберите конкретный объект из списка открытых заявок/сделок и подтвердите — это реальный запуск.
- Следите за журналом «Выполнение»: узлы подсвечиваются по очереди, эффекты помечаются значком «молния» (например, «создана задача», «выставлен счёт»).
- Когда движок дойдёт до развилки с вопросом, ответьте «Да» или «Нет» — процесс пойдёт по выбранной ветке.
- По завершении процесс запишется в «Последние запуски», увеличит счётчик запусков и оставит запись в ленте активности. Кнопка «Сброс» очищает подсветку схемы для нового прогона.
- Чтобы изменить схему — «Редактировать»; чтобы сделать похожий процесс — «Дублировать» (создастся копия-черновик).
Взаимосвязи
- Через #deals: узлы «Перенос на этап», «Метки», «Ответственный», «Счёт», «Конвертация заявки» напрямую меняют сделки; перенос на этап дополнительно запускает автоматизации воронки.
- Через #leads: узлы меняют статус заявки и конвертируют её в контакт + сделку.
- Через #tasks: действие «Создать задачу» кладёт задачи ответственному со сроком; они видны в разделе «Задачи».
- Через #finance: действие «Счёт» создаёт документ в «Финансах».
- Через #automation: перенос сделки на этап внутри процесса вызывает те же правила автоматизаций воронок; движок процессов и системные сценарии живут на одной вкладке раздела.
- Через #dashboard: каждый реальный запуск пишется в ленту активности.
Под капотом (технически)
Процессы хранятся в коллекции processes, история реальных прогонов — в processRuns (не более 50 последних). Схема — это набор узлов nodes[] и переходов edges[] с координатами col/row для раскладки. Движок (функция startProcessRun в js/views2.js) идёт от узла типа start по переходам с шагом ~1 сек; в реальном режиме на каждом узле с полем do вызывает bpExecAction, которая и совершает изменения в CRM. Развилки типа condition в симуляции решаются полем chance (вероятность ветки «да»), в реальном режиме — ответом человека. Защита от зацикливания — не более 30 шагов на прогон.
| Поле процесса / узла | Смысл |
|---|---|
| name, description, ownerId | Название, описание-регламент, владелец процесса. |
| active | Активен (true) или черновик (false). |
| target | Цель процесса: lead (заявка) или deal (сделка). |
| runs, avgTime | Счётчик успешных запусков и среднее время прохождения. |
| nodes[].type | start · action · condition · end. |
| nodes[].do.kind | Действие узла: createTask, addTags, setOwner, moveStage, createInvoice, leadStatus, leadConvert, notify. |
| nodes[].test.question | Вопрос, который движок задаёт человеку на развилке при реальном запуске. |
| edges[].from / to / label | Переход между узлами и подпись ветки («да» / «нет» / «повторно»). |
| processRuns[] | Запись прогона: processId, цель, время, статус (done/aborted), число шагов, список effects[]. |
Автоматизация и сценарии
Три уровня автоматизации рутины: системные сценарии, которые сервер исполняет сам круглосуточно; правила автоматизации этапов воронки, срабатывающие при переносе сделки; и почтовые цепочки писем в маркетинге. Всё это снимает с менеджеров ручные напоминания и типовые действия.

Назначение
Автоматизация отвечает за то, чтобы важные вещи происходили без напоминаний: просроченная задача не потерялась, зависшая сделка получила следующий шаг, заявка без ответа подсветилась, счёт-должник дошёл до финансиста. Часть правил работает на сервере постоянно (даже когда CRM ни у кого не открыта), часть — мгновенно реагирует на действия в воронке, а маркетинговые цепочки ведут подписчиков по заранее заданной серии писем.
Что делает
- Системные сценарии (коллекция
scenarios): 7 готовых правил, которые сервер прогоняет по расписанию — автоперенос просроченных задач с эскалацией, оживление зависших сделок, SLA заявок и тикетов, напоминание о неоплаченных счетах, напоминание о брони онлайн-звонка, утренняя сводка. Каждое можно включить/выключить и задать порог (часы/дни/минуты). - Автоматизации воронок (коллекция
automations): правила «при попадании сделки на этап» — создать задачу, назначить ответственного, добавить метки, перенести на другой этап. Срабатывают в момент, когда сделка приходит на нужный этап. - Цепочки писем (коллекция
mailAutomations, раздел «Маркетинг»): серии писем по триггеру — Welcome-цепочка новому подписчику, дожим брошенной заявки, реанимация «спящих» клиентов. - Уведомления от сценариев уходят по каналам, настроенным в «Настройки → Уведомления», и адресуются либо ответственному, либо всем подписанным на тип события (заявки, тикеты, брони).
Основные экраны и элементы
Системные сценарии живут на второй вкладке раздела «Бизнес-процессы» — сеткой карточек: иконка, название, статус «Работает/Выключен», описание, поля порогов и переключатель. Настраивать их могут администратор и РОП. Автоматизации воронок редактируются из раздела «Сделки/Воронка»: у этапа с правилом горит значок «молния», по нему открывается список правил этапа и модальное окно «Правило автоматизации» с галочками действий. Цепочки писем — в разделе «Маркетинг», вкладка «Автоматизации»: карточки цепочек с триггером, числом шагов, переключателем «Активна» и статистикой прохождений/открытий.
Как пользоваться — пошагово
- Системный сценарий: откройте «Бизнес-процессы → Системные сценарии», найдите нужную карточку, при необходимости поправьте порог (например, «Часов до сигнала») и включите переключатель «Сценарий включён». Дальше сервер работает сам.
- Автоматизация этапа: в воронке нажмите значок «молния» у этапа (или откройте настройки этапа) → «Добавить правило» → отметьте действия (создать задачу, назначить, метки, перенос) и сохраните. Теперь любая сделка, пришедшая на этот этап, получит эти действия автоматически.
- Проверка: перенесите тестовую сделку на этап с правилом — появится всплывающее «⚡ Автоматизация…» и запись в ленте активности.
- Цепочка писем: в «Маркетинге → Автоматизации» нажмите «Цепочка», выберите триггер, соберите шаги письмами и включите «Активна».
Взаимосвязи
- Через #bizproc: те же правила автоматизаций воронки вызываются, когда бизнес-процесс переносит сделку на этап; сценарии и процессы делят один раздел.
- Через #tasks: и сценарии, и автоматизации этапов создают задачи ответственным.
- Через #deals и #leads: автоматизации меняют сделки; сценарии следят за зависшими сделками, SLA заявок и просроченными задачами.
- Через #finance: сценарий «Просроченные счета» заводит задачу-напоминание финансисту.
- Через #settings: каналы и адресаты уведомлений берутся из «Настройки → Уведомления»; права на сценарии — из ролей.
- Через #mail: цепочки писем работают поверх подписчиков и кампаний маркетинга.
Под капотом (технически)
Системные сценарии исполняет серверная функция scenarioTick (server/server.js), которая запускается по внутреннему таймеру и на каждом тике проверяет коллекции задач, сделок, заявок, тикетов, счетов и броней. Настройка каждого сценария — запись в scenarios с полями enabled и params; выключенный сценарий пропускается. Чтобы правило не срабатывало повторно, объекты помечаются служебными штампами (например, дата автопереноса задачи, «сигнал по заявке отправлен»). Автоматизации воронок исполняет клиентская функция runAutomations(deal) (js/views.js) при попадании сделки на этап; перенос на этап делается последним и без повторного запуска правил — защита от бесконечного цикла.
| Сущность | Ключевые поля |
|---|---|
| scenarios[] | id (например sc_lead_sla), enabled, params (порог: hours / days / minutes / maxTimes / hour). |
| automations[] | funnelId, stageId, enabled и блоки действий createTask, setOwner, addTags, moveTo (каждый с флагом on). |
| mailAutomations[] | name, trigger, steps, enabled, статистика passed / opens. |
Готовые системные сценарии: автоперенос просроченных задач (с эскалацией РОПу после N переносов), зависшие сделки, SLA заявок, SLA тикетов портала, просроченные счета, напоминание о брони звонка, утренняя сводка.
Кастомные поля
Конструктор собственных полей для сделок, контактов и компаний. Добавленное поле сразу появляется в форме создания, в карточке объекта, при желании — колонкой в реестре, в экспорте и поиске. Так CRM подстраивается под данные именно вашего бизнеса без правки кода.

Назначение
У каждой компании свои важные атрибуты — источник бюджета сделки, дата отгрузки, Telegram контакта, сегмент клиента, подписан ли NDA. Кастомные поля позволяют завести их самостоятельно и хранить прямо в карточках, не дожидаясь доработок. Поле определяется один раз в настройках и дальше применяется по всей CRM единообразно.
Что делает
- Позволяет создавать поля для трёх сущностей: Сделки, Контакты, Компании.
- Поддерживает 11 типов: Текст, Многострочный текст, Число, Деньги, Дата, Список, Мультисписок, Да/Нет, Ссылка, Телефон, Email.
- Для списков и мультисписков задаются варианты (минимум 2); значения выбираются из них.
- Флаг «Обязательное» требует заполнения в форме; флаг «Показывать колонкой в реестре» выводит поле столбцом в таблице сущности.
- Поля упорядочиваются стрелками «выше/ниже» — в этом порядке они идут в форме и карточке.
- Значения полей отображаются в карточке, попадают в CSV-экспорт, участвуют в поиске и фиксируются в истории изменений объекта.
Основные экраны и элементы
Всё живёт в «Настройки → Поля». Вверху — чипы-переключатели сущностей (Сделки / Контакты / Компании) со счётчиком полей. Ниже — таблица полей: порядок, название, тип, варианты, признаки («обязательное», «в таблице») и действия (изменить / удалить / переместить). Кнопка «Добавить поле» открывает модальное окно: название, тип (у существующего поля тип менять нельзя), блок вариантов для списков, галочки «Обязательное» и «Показывать колонкой». Добавленное поле немедленно встраивается в формы и карточки соответствующей сущности.
Как пользоваться — пошагово
- Откройте «Настройки → Поля» и выберите сущность (например, «Сделки»).
- Нажмите «Добавить поле», введите название и выберите тип. Для «Списка»/«Мультисписка» впишите варианты — по одному в строке.
- При необходимости отметьте «Обязательное» и/или «Показывать колонкой в реестре».
- Сохраните — поле сразу появится в форме создания и в карточках этой сущности.
- Стрелками «выше/ниже» задайте порядок полей; кнопкой «Изменить» правьте название и варианты (тип у созданного поля уже зафиксирован).
- Заполняйте значение при создании или редактировании сделки/контакта/компании — оно сохранится в карточке и, если включено, покажется колонкой в реестре.
Взаимосвязи
- Через #deals, #contacts, #companies: поля встраиваются в формы, карточки и реестры этих сущностей.
- Через #settings: конструктор полей — раздел настроек; изменения доступны при праве на кастомные поля.
- Через экспорт/импорт: значения кастомных полей попадают в CSV и распознаются при загрузке из файла.
- Через историю: изменения значений кастомных полей фиксируются в ленте истории объекта.
Под капотом (технически)
Определения полей хранятся в коллекции customFields, а значения — прямо в объекте сущности в подсловаре custom = { fieldId: value }. При выводе форм, карточек и колонок таблицы CRM берёт список полей нужной сущности (cfFieldsFor(entity), js/views.js), сортирует по order и рендерит соответствующий тип ввода. Тип поля неизменяем после создания (чтобы не «сломать» уже сохранённые значения); удаление поля показывает, в скольких карточках оно уже заполнено.
| Поле определения | Смысл |
|---|---|
| entity | Сущность: deal · contact · company. |
| name | Название поля (показывается в форме и карточке). |
| type | Тип: text, textarea, number, money, date, select, multiselect, checkbox, url, phone, email. |
| options | Список вариантов — только для select / multiselect (минимум 2). |
| required | Обязательное для заполнения в форме. |
| showInTable | Выводить поле отдельной колонкой в реестре сущности. |
| order | Порядок вывода среди полей сущности. |
Почта
Личная переписка менеджера прямо в CRM: список входящих и отправленных, чтение письма, инлайн-композер с ответом/пересылкой, копией, скрытой копией и вложениями. Приём идёт с реального почтового ящика по IMAP, отправка — по SMTP того же ящика; письма привязываются к контактам, а из любого письма можно за один клик создать задачу, сделку или открыть карточку клиента.

Назначение
Дать менеджеру вести деловую переписку, не выходя из CRM, и держать её в одном контексте с клиентом. В отличие от раздела «Рассылки» (массовые письма от маркетингового адреса через ESP), «Почта» — это личный ящик сотрудника: полноценные ответы конкретному человеку с вложениями и сохранением цепочки (threading). Каждое входящее автоматически сопоставляется с контактом по адресу отправителя, поэтому переписка сама «прилипает» к нужной карточке.
Что делает
- Показывает две папки — «Входящие» и «Отправленные»; у входящих виден счётчик непрочитанных, важные письма всплывают наверх списка.
- Забирает свежие входящие по кнопке «Проверить почту» (значок обновления) — сервер обращается к ящику по IMAP и добавляет новые письма.
- Открывает письмо на чтение: тема, отправитель с адресом, получатели, дата/время, тело и список вложений (скачиваемые, если файл лежит в CRM).
- Помечает письмо прочитанным при открытии и позволяет ставить/снимать метку «важное» (звезда).
- Инлайн-композер для нового письма, ответа, «ответить всем» и пересылки — с полями «Кому», «Копия» (Cc), «Скрытая» (Bcc), «Тема», выбором шаблона и вложениями.
- Подстановка шаблона письма: выбранный шаблон рендерит тему и текст с плейсхолдерами (имя, компания, сделка, сумма, менеджер и т. п.) по данным получателя.
- Прикрепление файлов: загружаются в файловое хранилище CRM, при отправке сервер подкладывает их в письмо как вложения.
- Из письма через меню «Ещё» — создать задачу, создать сделку, открыть контакт, удалить письмо.
- Поиск по списку (тема, имя отправителя, текст) через общую строку поиска.
Основные экраны и элементы
Двухпанельный макет. Слева — панель папок (чипы «Входящие»/«Отправленные»), кнопка «Проверить почту» (видна, если настроен IMAP-приём) и кнопка «Написать» (карандаш; видна, если настроена отправка). Ниже — список писем: аватар, отправитель (или получатель для «Отправленных»), тема, первая строка текста, время/дата, пометка вложений и точка непрочитанного. Справа — либо область чтения (шапка с темой, отправителем и кнопками «Ответить», «Всем», «Переслать», звезда «важное», меню «Ещё»; тело письма и блок вложений), либо композер (поля адресов, тема, селектор «Шаблон», текстовое поле, вложения, кнопки «Вложить файл» / «Отмена» / «Отправить»). Если отправка недоступна, кнопки ответа и композер не показываются — письма можно только читать.
Как пользоваться — пошагово
- Откройте раздел «Почта». По умолчанию активна папка «Входящие».
- Нажмите кнопку обновления («Проверить почту»), чтобы подтянуть свежие письма с ящика по IMAP — покажет, сколько новых пришло.
- Кликните письмо в списке — оно откроется справа и отметится прочитанным.
- Для ответа нажмите «Ответить» (или «Всем» / «Переслать»). Откроется композер с уже заполненными адресом, темой (RE:/FWD:) и цитатой; ответ сохранит цепочку письма.
- Чтобы написать с нуля — кнопка с карандашом. Заполните «Кому»; при необходимости раскройте «Копия» и «Скрытая».
- Опционально выберите «Шаблон» — тема и текст подставятся и подстроятся под получателя (плейсхолдеры заменятся его данными).
- Нажмите «Вложить файл», выберите файлы — они загрузятся в CRM и прикрепятся к письму.
- Нажмите «Отправить». Письмо уйдёт с вашего ящика по SMTP и появится в папке «Отправленные».
- При необходимости из открытого письма через меню «Ещё» создайте задачу или сделку либо откройте карточку контакта.
Взаимосвязи
- Контакты — входящее письмо автоматически привязывается к контакту по совпадению email отправителя; из письма открывается карточка контакта (#contacts).
- Задачи — «Создать задачу» из письма переносит тему и контакт в новую задачу (#tasks).
- Сделки — «Создать сделку» подставляет тему письма как название и контакт/компанию (#deals).
- Шаблоны писем — общий набор с разделом «Рассылки»: те же
emailTemplatesиспользуются и в композере «Почты», и в цепочках (#mailing). - Файлы — вложения хранятся в файловом хранилище CRM и отдаются по защищённой ссылке.
- Синхронизация — коллекция
emailsедет через общий механизм/api/state, отправка/приём — через отдельные серверные роуты.
Под капотом (технически)
Экран строит Views.mail (js/views2.js). Данные хранятся в коллекции emails; отправленные письма локально дописываются в неё после успешной отправки, входящие приходят с сервера после IMAP-опроса. Отправка и приём — не через общий /api/state, а через отдельные роуты: приём — POST /api/mail/fetch (движок server/imap.js), отправка — POST /api/mail/send (движок server/smtp.js, с фолбэком на ESP).
| Коллекция | Поле | Смысл |
|---|---|---|
emails | id | идентификатор письма в CRM |
folder | inbox / sent — папка | |
messageId | Message-ID письма (ключ дедупликации при IMAP-приёме) | |
fromName, fromEmail, to, toList, ccList | отправитель и получатели (осн. + копия) | |
contactId | привязка к контакту по email (или null) | |
subject, text | тема и текст | |
date, time | дата и время письма | |
read, important | прочитано / помечено важным | |
attachments[] | вложения: имя, расширение, размер, fileId (ссылка на файл в CRM) |
Движок приёма — IMAP (server/imap.js), концептуально. Zero-dependency клиент поверх защищённого TLS-соединения выполняет короткую сессию: вход по учётным данным ящика → выбор папки INBOX → поиск и выборка последних писем → выход. Сырое RFC-822 письмо разбирается: декодируются MIME encoded-words в теме и имени отправителя, извлекается читаемый текст (умеет multipart и вложенный multipart, base64/quoted-printable, кодировки UTF-8 и windows-1251, а при отсутствии текстовой части — грубое приведение HTML к тексту). Серверный imapPoll добавляет во «Входящие» только новые письма (по messageId) и сопоставляет их с контактами. Учётные данные ящика (хост, логин, пароль приложения) живут только в переменных окружения сервера и никогда не попадают в код, логи или интерфейс.
Движок отправки — SMTP (server/smtp.js), концептуально. Тоже zero-dependency поверх неявного TLS. Собирает полноценное MIME-сообщение: заголовки From/To/Cc, RFC 2047 для не-ASCII в теме и имени, тред-заголовки In-Reply-To/References (чтобы ответ лёг в ту же цепочку), а при наличии файлов — multipart/mixed с телом и вложениями в base64. Затем ведёт SMTP-диалог (приветствие → представление → аутентификация → отправители/получатели, включая скрытую копию → передача тела). Отправка идёт с личного ящика сотрудника, поэтому доступны копия, скрытая копия и вложения. Если SMTP-ящик не настроен, сервер откатывается на ESP, но тогда доступна только базовая отправка одному адресу (без Cc/Bcc/вложений). Хост, логин и пароль ящика — только в окружении сервера.
Рассылки
Массовый e-mail-маркетинг поверх внешнего сервиса рассылок (ESP «SendInbox»): база подписчиков, кампании с HTML-письмом и отчётом (открытия, клики, отписки, возвраты), цепочки авторассылок (триггер → отправки/паузы/условия), проверка адресов по DNS и общий каталог шаблонов писем. CRM задаёт сценарий и хранит статистику, а реальную доставку, отписки и статистику берёт на себя ESP; события прилетают обратно в CRM подписанными вебхуками.

Назначение
Вести маркетинговую и транзакционную коммуникацию по всей базе разом: рассылать дайджесты и акции, прогревать новых подписчиков welcome-цепочкой, дожимать брошенные заявки, реанимировать «спящих» клиентов и держать базу чистой (отписки и жёсткие отказы автоматически выводят адрес из активной рассылки). Всё это — от маркетингового адреса через полноценный ESP, а не с личного ящика.
Что делает
- Кампании: создание письма (название, тема, HTML-тело или выбор шаблона), запуск через ESP, отчёт по каждой кампании (Open Rate, Click Rate, отписки, возвраты), дублирование и удаление в корзину.
- Сводка сверху: размер базы, средний Open/Click Rate по отправленным, всего отписок.
- Баннер ESP: показывает, подключён ли SendInbox, боевой режим или песочница, включены ли вебхуки статистики и какой адрес-отправитель.
- Подписчики: список с email, именем, источником, статусом (валиден/невалиден/риск/не проверен) и датой подписки; добавление, отписка/возврат, проверка адреса, удаление в корзину, экспорт CSV.
- Проверка базы: массовая проверка адресов по DNS (реальный MX-запрос на сервере), обновление статусов.
- Автоматизации (цепочки): визуальный редактор сценария — старт по триггеру, затем шаги «отправить письмо (шаблон)», «пауза», «условие» (открыл/не открыл, кликнул/не кликнул), включение/пауза, статистика прохождения.
- Проверка почт: отдельная вкладка — вставить список адресов и проверить каждый (синтаксис, одноразовые домены, опечатки в популярных доменах, наличие MX-записи).
- Шаблоны: общий с «Почтой» каталог писем с плейсхолдерами и живым предпросмотром.
- Транзакционные письма: тот же ESP отправляет одиночные системные письма (когда личный SMTP-ящик не настроен — «Почта» тоже уходит через ESP как фолбэк).
Основные экраны и элементы
Сверху — подпанель из пяти вкладок с счётчиками: Кампании, Подписчики, Автоматизации, Проверка почт, Шаблоны. На «Кампаниях» — баннер состояния ESP, четыре плитки-метрики и таблица кампаний (статус пилюлей, дата, отправлено, полосы Open/Click, кнопка «Отправить» у неотправленных). Клик по строке открывает карточку кампании (drawer): отчёт с метриками, действия (Отправить/Редактировать/Дублировать/Удалить), безопасный предпросмотр письма в изолированном iframe, дата, отправитель и ID кампании в SendInbox. «Подписчики» — таблица с фильтрами по статусу и карточкой подписчика (drawer: правка, проверка email, отписать/вернуть, удалить, связь с контактом CRM). «Автоматизации» — карточки цепочек с переключателем и drawer-редактором сценария (таймлайн шагов, добавление письма/паузы/условия, перестановка шагов). «Шаблоны» — карточки с модалкой создания/правки, кнопками-плейсхолдерами и предпросмотром на данных первого контакта.
Как пользоваться — пошагово
- Проверьте баннер ESP на вкладке «Кампании»: если SendInbox не подключён, отправка недоступна — сначала его настраивает администратор в конфиге сервера.
- Наполните базу: вкладка «Подписчики» → «Подписчик» (адрес проверится сразу) или импортируйте адреса; нажмите «Проверить базу», чтобы обновить статусы по DNS.
- Соберите шаблоны (вкладка «Шаблоны») — они пригодятся и в кампаниях, и в цепочках, и в «Почте».
- Создайте кампанию: «Кампания» → название, тема, HTML-тело (или выбор шаблона). Ссылку отписки ESP добавит сам.
- Откройте карточку кампании, проверьте предпросмотр письма и нажмите «Отправить». Подтвердите отправку по числу активных подписчиков.
- Если ESP в режиме песочницы — кампания создастся в SendInbox, но письма реально не уйдут (для проверки сценария).
- После отправки метрики (открытия, клики, отписки, возвраты) докрутятся автоматически — их присылает SendInbox вебхуками.
- Для авторассылки: «Автоматизации» → «Цепочка», задайте триггер и соберите шаги (письмо → пауза → условие), затем «Запустить».
Взаимосвязи
- Шаблоны писем — общая коллекция
emailTemplatesс разделом «Почта»: один шаблон используется и в кампаниях, и в цепочках, и в личных письмах (#mail). - Контакты — подписчик сопоставляется с контактом CRM по email; из карточки подписчика открывается контакт (#contacts).
- Заявки/сделки — триггеры цепочек опираются на события CRM (новая заявка без ответа, отсутствие сделок и писем 90 дней и т. п.) (#leads, #deals).
- Публичная форма сайта — заявки с aerobox.online попадают в CRM и могут стать источником подписчиков/триггером цепочки.
- Роли и права — запуск кампаний требует права
campaigns; редактирование подписчиков/цепочек/шаблонов — своих прав; часть действий доступна только на просмотр (#roles). - Корзина — удалённые кампании и подписчики уходят в корзину, а не стираются сразу.
Под капотом (технически)
Экран строит Views.mailing (js/views2.js). Данные кампаний, подписчиков, цепочек и шаблонов хранятся в коллекциях и синхронизируются через общий /api/state. Отправка кампании и приём событий идут через отдельные серверные роуты и движок ESP (server/esender.js). Ключевые роуты: GET /api/esender/status (для баннера), POST /api/campaigns/{id}/send (запуск рассылки), POST /api/esender/webhook (приём событий), POST /api/verify-email (проверка адресов по DNS).
| Коллекция | Поле | Смысл |
|---|---|---|
campaigns | id, name, subject | идентификатор, название, тема |
status | draft / scheduled / sending / sent | |
htmlBody, templateId | тело письма: свой HTML или выбранный шаблон | |
sent, opens, clicks, unsub, bounces | метрики (докручиваются вебхуком) | |
provider, providerId, providerListId | привязка к сущностям в ESP (для идемпотентности и отчётов) | |
sandbox, date, sentAt | признак песочницы и даты отправки | |
subscribers | id, email, name | идентификатор и адрес |
source | источник (клиенты CRM, форма, вебинар, выставка, вручную) | |
status | valid / invalid / risky / unknown, а также «мёртвые»: unsubscribed / bounced / spam | |
subscribedAt | дата подписки | |
| — | активной аудиторией считаются все, кроме отписавшихся/невалидных/возвратов/жалоб | |
mailAutomations | id, name, trigger | цепочка и её триггер |
flow[] | шаги сценария: send (шаблон), wait (пауза), condition (открыл/кликнул) | |
enabled | работает / на паузе | |
passed, opens | сколько получателей прошло и открытий | |
emailTemplates | id, name, subject, body | шаблон письма (общий с «Почтой») |
| плейсхолдеры | {{имя}}, {{компания}}, {{сделка}}, {{сумма}}, {{менеджер}} и др. — подстановка по данным получателя |
Движок ESP — SendInbox (server/esender.js), концептуально. Zero-dependency клиент внешнего API рассылок. При запуске кампании сервер идемпотентно (с промежуточным сохранением состояния, чтобы повтор после сбоя не плодил дубли) создаёт под кампанию список, синхронизирует в него активных подписчиков, заводит черновик письма и запускает отправку; терминальный статус sent и число получателей фиксируются атомарно. Получателями становятся только «живые» подписчики. В режиме песочницы всё валидируется, но письма не уходят. Ключ ESP, подтверждённый адрес-отправитель и секрет вебхуков хранятся исключительно в переменных окружения сервера и не попадают в код, логи, память или интерфейс.
Приём событий — вебхуки (концептуально). ESP шлёт события доставки (отправлено/открытие/клик/возврат/жалоба/отписка) на роут POST /api/esender/webhook. Каждый запрос проверяется по подписи HMAC-SHA256 над сырым телом (сравнение timing-safe, до разбора JSON; при неверной подписи — отказ и запись в аудит); есть дешёвый отброс явно неверных подписей и защита от флуда. Принятые события дедуплицируются и применяются: счётчики кампании увеличиваются, а жёсткий отказ/жалоба/отписка автоматически переводят подписчика в «мёртвый» статус и выводят из активной базы. Так метрики и чистота базы поддерживаются без ручного труда.
Проверка адресов (концептуально). Роут POST /api/verify-email проверяет каждый адрес: синтаксис, одноразовые домены, типичные опечатки в популярных доменах и, главное, реальный DNS-запрос MX-записи (с кэшем и таймаутом). Результат — статус «валиден» / «риск» / «невалиден». Если сервер недоступен, во фронтенде есть локальный эвристический фолбэк.
Календарь — CalDAV (server/caldav.js), концептуально. Смежный движок раздела: помимо read-only ICS-фида (подписка на календарь) CRM умеет сама класть событие в чужой календарь (push) — задачу или онлайн-звонок. По роуту POST /api/caldav/push формируется одиночный VEVENT (заголовок, время, напоминание) и через защищённое соединение с Basic-аутентификацией кладётся в коллекцию календаря (создание/обновление по ETag). Роуты /api/calendar/token и /api/calendar/regenerate управляют ссылкой ICS-фида. Учётные данные календаря (URL коллекции, логин, пароль приложения) — только в окружении сервера.
Чаты
Единое окно переписки с клиентами из Telegram, WhatsApp, ВКонтакте и Email. Слева — список диалогов, справа — активная беседа. Ответить, поставить задачу или завести сделку можно прямо из чата, не покидая раздел.

Назначение
Раздел собирает входящие и исходящие сообщения по клиентам в один интерфейс, чтобы менеджер не переключался между приложениями. Каждый диалог привязан к контакту CRM, поэтому из переписки видно компанию собеседника и есть быстрый переход к его карточке, задачам и сделкам.
Что делает
- Показывает список всех диалогов с аватаром контакта, последним сообщением и временем.
- Помечает канал каждой переписки цветной пилюлей: Telegram, WhatsApp, ВКонтакте или Email.
- Открывает выбранную переписку в правой панели — с историей входящих и исходящих реплик.
- Позволяет отправить ответ прямо из поля ввода (кнопкой «Отправить» или клавишей Enter).
- Автоматически прокручивает ленту к последнему сообщению при открытии диалога.
- Даёт из шапки чата три действия: открыть карточку контакта, поставить задачу «ответить», перейти к сделке (или создать новую).
Основные экраны и элементы
Левая колонка — список диалогов. Каждая строка: аватар в цвете канала, имя контакта, время последней реплики, превью последнего сообщения и пилюля с названием канала. Активный диалог подсвечен. Правая колонка — окно беседы. Сверху шапка: аватар и имя контакта, канал и компания, а также кнопки «Контакт», «В задачу», «Сделка». В центре — лента сообщений: входящие (in) прижаты влево, исходящие (out) — вправо, у каждого стоит время. Внизу — поле «Напишите сообщение…» и кнопка «Отправить». Если ни один диалог не выбран, показывается заглушка «Диалог не выбран».
Как пользоваться — пошагово
- Откройте раздел «Чаты» — первый диалог из списка раскроется автоматически.
- Кликните нужную переписку слева, чтобы открыть её справа.
- Прочитайте историю: серые входящие слева, ваши ответы справа с отметками времени.
- Наберите текст в поле внизу и нажмите «Отправить» или Enter — сообщение добавится в ленту.
- Нужно продолжить работу с клиентом — нажмите «Контакт», чтобы открыть карточку; «В задачу», чтобы поставить напоминание перезвонить/ответить; «Сделка», чтобы перейти к открытой сделке (а если её нет — предложит создать).
Взаимосвязи
- Каждый чат привязан к контакту из раздела #contacts — по нему подтягиваются имя, аватар и компания (#companies).
- Кнопка «В задачу» создаёт запись в разделе #tasks с уже заполненным контактом и компанией.
- Кнопка «Сделка» ведёт в #deals: открывает существующую открытую сделку контакта или создаёт новую.
- Цвета и названия каналов берутся из общего справочника каналов (Telegram / WhatsApp / ВКонтакте / Email), общего с настройками уведомлений.
Под капотом (технически)
Данные лежат в коллекции chats. Каждая переписка — объект с историей сообщений; список сообщений хранится прямо внутри записи чата. Отправка ответа добавляет сообщение в массив и сохраняет состояние (общая синхронизация через /api/state), после чего лента перерисовывается. Названия и цвета каналов задаются картой channelMeta в js/ui.js. Представление — Views.chats в js/views.js.
| Поле записи чата | Смысл |
|---|---|
id | Идентификатор диалога. |
contactId | Ссылка на контакт CRM — источник имени, аватара и компании. |
channel | Канал переписки: telegram, whatsapp, vk или mail. |
messages[] | Лента реплик по порядку. |
messages[].in | true — входящее от клиента; false — исходящее от менеджера. |
messages[].text | Текст сообщения. |
messages[].time | Отметка времени реплики (строкой, как показывается в ленте). |
Звонки
Журнал телефонных звонков: входящие, исходящие и пропущенные — с длительностью, менеджером, записью разговора и комментарием. Сверху — сводка по метрикам, ниже — таблица истории с фильтрами и быстрым «Перезвонить» по пропущенным.

Назначение
Раздел ведёт полную историю телефонного общения с клиентами и связывает каждый звонок с контактом и менеджером. Он помогает не терять пропущенные (их видно отдельно и по ним есть кнопка обратного звонка), оценивать нагрузку по метрикам и превращать разговор в задачу или сделку.
Что делает
- Считает сводку: всего звонков, принятых входящих, совершённых исходящих, пропущенных и среднюю длительность состоявшихся.
- Фильтрует журнал чипами: «Все», «Входящие», «Исходящие», «Пропущенные» — с счётчиком в каждом.
- Ищет по имени контакта, номеру телефона и комментарию.
- Показывает по каждому звонку направление (иконка вход/исход/пропущен), абонента с номером и компанией, менеджера, дату и время, длительность, запись и комментарий.
- Проигрывает запись разговора кнопкой ▶ (в демо — демо-запись; настоящая появляется после реального звонка).
- По пропущенным даёт кнопку «Перезвонить», которая открывает форму обратного звонка с подставленным номером.
- Экспортирует журнал в CSV с учётом активного фильтра.
- По меню строки: открыть контакт, создать задачу, создать сделку, удалить запись из журнала.
Основные экраны и элементы
Сверху — полоса из пяти карточек-метрик (всего / входящие / исходящие / пропущенные / средняя длительность). Ниже — панель инструментов: чипы-фильтры со счётчиками, индикатор «Телефония подключена», кнопка экспорта CSV и кнопка «Позвонить». Дальше — таблица журнала: столбцы «направление», «Абонент», «Менеджер», «Когда», «Длительность», «Запись», «Комментарий» и колонка действий. Иконка направления окрашена (входящий / исходящий / пропущенный). В колонке «Запись» — кнопка проигрывания и анимированная звуковая дорожка. Клик по строке открывает карточку звонка; отдельное меню (три точки) даёт быстрые действия. По кнопке «Позвонить» открывается модалка нового звонка с выбором контакта, полем номера и комментарием (в демо-режиме звонок имитируется).
Как пользоваться — пошагово
- Откройте раздел «Звонки» — сверху увидите сводку, ниже полную историю.
- Отфильтруйте список чипами (например «Пропущенные»), чтобы сфокусироваться на нужном, или воспользуйтесь поиском по имени/номеру.
- Чтобы позвонить, нажмите «Позвонить», выберите контакт (номер подставится сам) или введите номер вручную, добавьте комментарий и нажмите «Позвонить» — запись появится в журнале.
- По пропущенному нажмите «Перезвонить» — откроется форма обратного звонка с уже подставленным номером; исходный пропущенный пометится «→ перезвонили».
- Кликните по строке, чтобы открыть карточку звонка, или откройте меню (три точки), чтобы создать задачу/сделку, перейти к контакту либо удалить запись.
- При необходимости выгрузите текущий список кнопкой экспорта CSV.
Взаимосвязи
- Абонент связывается с контактом из #contacts; по контакту подтягивается компания из #companies. Если контакт не найден — показывается «Неизвестный номер».
- Менеджер — сотрудник из #settings (команда): его аватар и имя выводятся в колонке.
- «Создать задачу» из меню ведёт в #tasks с заголовком по абоненту и комментарию.
- «Создать сделку» ведёт в #deals с подставленными контактом и компанией.
- Удаление записи обновляет счётчики-бейджи в навигации.
Под капотом (технически)
Данные — коллекция calls. Список сортируется по дате и времени (свежие сверху), метрики и фильтры считаются на лету из статусов и направлений. Новый звонок в демо-режиме создаётся со случайной длительностью и флагом записи; изменения сохраняются через общую синхронизацию состояния (/api/state). Представление — Views.calls и форма openCallModal в js/views2.js.
| Поле записи звонка | Смысл |
|---|---|
id | Идентификатор записи журнала. |
dir | Направление: in — входящий, out — исходящий. |
status | done — состоялся, missed — пропущен. |
contactId | Ссылка на контакт (может быть пустой — «Неизвестный номер»). |
phone | Номер телефона абонента. |
userId | Менеджер, обработавший звонок. |
date / time | Дата и время звонка. |
duration | Длительность в секундах (0 — для пропущенных). |
record | Есть ли запись разговора. |
note | Комментарий менеджера к разговору. |
Онлайн-звонки
Встроенные видеовстречи по ссылке — аналог Телемоста, без установки приложений. Организатор создаёт встречу и отправляет клиенту ссылку; гость входит по одному имени, без логина. До 30 участников, демонстрация экрана, чат, запись и живой транскрипт. После звонка CRM сама собирает протокол с решениями и задачами и короткий доклад.

Назначение
Раздел даёт компании собственный сервис видеовстреч прямо в CRM: не нужно внешних площадок, а все итоги (запись, расшифровка, решения, поручения) остаются привязанными к сделке и компании. Гости подключаются по ссылке без регистрации, а сотрудники узнаются автоматически по своей сессии.
Что делает
- Создаёт встречу с уникальной ссылкой — с датой или «по ссылке в любой момент».
- Пускает гостей по ссылке без логина (только имя), сотрудников — по их учётной записи; до 30 участников.
- Показывает журнал встреч со статусами «Запланирована / Идёт сейчас / Завершена» и метриками (проведено, минут в звонках, с записью, с протоколом).
- Внутри звонка: видео и аудио участников, микрофон/камера, демонстрация экрана, чат встречи, живой транскрипт, запись.
- Пишет живой транскрипт распознаванием речи в браузере (ru-RU) — каждый участник распознаёт свою речь.
- Записывает звонок в видеофайл (композит из видео + микс аудио) и хранит его в CRM для пересмотра.
- После завершения автоматически формирует протокол (решения и задачи) и короткий доклад — экстрактивно из транскрипта или через ИИ, если подключён LLM.
- Позволяет из протокола одним кликом заводить задачи, печатать протокол и пересобирать его заново.
Основные экраны и элементы
В CRM (раздел «Онлайн-звонки»). Сверху карточки-метрики; ниже чипы-фильтры «Предстоящие / Прошедшие / Все» и кнопка «Новая встреча». Таблица встреч: название с привязкой к сделке/компании, время и длительность, статус-пилюля, участники и колонка «Итоги» (пилюли «Запись», «Транскрипт», «Протокол», «Доклад»). У активных встреч — кнопка «Войти», у всех — «Ссылка» и меню. Клик по строке открывает карточку встречи с вкладками: «Итоги» (доклад, решения, задачи), «Транскрипт», «Чат», «Запись» (видеоплеер и скачивание), «Инфо» (ссылка, участники, привязки). В карточке доступны «Печать протокола» и «Пересобрать протокол».
Комната звонка (страница по ссылке). Предвход: превью камеры, кнопки микрофона и камеры, поле имени и «Подключиться». Сам звонок: сетка участников по центру; сверху — название, таймер, счётчик участников и «Ссылка»; снизу — панель кнопок: микрофон, камера, демонстрация экрана, транскрибация моей речи, запись (доступна сотруднику), покинуть звонок. Справа выдвижная панель с вкладками «Чат / Участники / Транскрипт». У сотрудника-организатора есть кнопка «Завершить для всех». По окончании — экран «Звонок завершён» со ссылкой на итоги в CRM.
Как пользоваться — пошагово
- В разделе «Онлайн-звонки» нажмите «Новая встреча», задайте название, при желании дату/время и привязку к сделке и компании, затем «Создать и скопировать ссылку».
- Отправьте ссылку клиенту любым способом (она же копируется кнопкой «Ссылка»). Клиент откроет её в браузере, введёт имя и подключится — без установки и логина.
- Войдите во встречу кнопкой «Войти». В звонке включайте камеру/микрофон, при необходимости — демонстрацию экрана и транскрибацию, общайтесь в чате.
- Чтобы сохранить разговор, включите запись кнопкой ● (доступно сотруднику) — файл потом появится на вкладке «Запись».
- Завершите встречу («Покинуть звонок», а организатор может «Завершить для всех»). Когда комната опустеет, CRM автоматически финализирует встречу.
- Откройте карточку встречи в CRM: на вкладке «Итоги» — доклад, решения и задачи; кнопкой «+ В задачи» превратите поручение в задачу, «Печать протокола» — распечатайте, «Пересобрать протокол» — соберите заново.
Взаимосвязи
- Встреча привязывается к сделке из #deals и компании из #companies — из карточки есть переходы к ним; при создании встречи в ленту сделки пишется запись активности.
- Поручения из протокола заводятся задачами в #tasks (кнопка «+ В задачи»).
- Запись звонка хранится как файл и доступна на вкладке «Запись» (общее файловое хранилище, раздел #docs).
- Если подключён календарь (CalDAV из #settings → интеграции), запланированную встречу можно добавить в календарь кнопкой «В календарь».
- Участники-сотрудники сопоставляются с командой из #settings; гости отмечаются как «гость».
- Печать протокола использует общий механизм печати документов (бренд организации из настроек).
Под капотом (технически)
Раздел стоит на собственном движке встреч без внешних зависимостей. Клиент (call.html + js/call.js) соединяет участников по схеме WebRTC-mesh — каждый с каждым напрямую передаёт видео/аудио. Сервер server/meet.js — это сигнальный сервер: собственная реализация WebSocket (RFC 6455) поднимает «комнату» по токену встречи и пересылает служебные сообщения WebRTC (offer/answer/ICE) между участниками, а также рассылает события входа/выхода, чат, реплики транскрипта и состояние (микрофон/камера/экран/запись). Комната на время звонка — источник правды, периодически и при опустении сбрасывается в коллекцию. Транскрипт распознаётся в браузере (Web Speech API, ru-RU) и приходит на сервер готовыми репликами. Запись собирается на клиенте (композит кадров + микс аудио) и загружается на сервер чанками в файловое хранилище. По завершении вызывается финализация: считается длительность и формируется протокол — экстрактивно (частотный отбор ключевых реплик, поиск решений и задач по ключевым словам) или через ИИ, если задан внешний LLM. Транскрипт и имена гостей считаются недоверенными данными: имена очищаются от управляющих символов, а текст для LLM изолируется от инструкций (защита от инъекций).
Коллекция — meetings. Представление в CRM — Views.meet и openMeetDrawer в js/views2.js.
| Поле встречи | Смысл |
|---|---|
id / token | Идентификатор в CRM и токен в ссылке-приглашении. |
title | Название встречи. |
createdBy / createdAt | Организатор и дата создания. |
dealId / companyId | Привязки к сделке и компании (могут быть пустыми). |
scheduledAt | Запланированные дата и время (необязательно — встреча живёт по ссылке). |
status | scheduled / live / done — запланирована / идёт / завершена. |
startedAt / endedAt / durationMin | Начало, конец и длительность в минутах. |
participants[] | Участники: имя, ссылка на сотрудника (или гость), время входа и выхода. |
chat[] | Сообщения чата встречи (имя, текст, время). |
transcript[] | Реплики транскрипта (имя, текст, время). |
recordingFileId | Ссылка на видеофайл записи в хранилище. |
summary | Короткий доклад по разговору. |
protocol | Протокол: списки decisions (решения) и tasks (задачи) плюс engine — как собран (extractive или llm). |
Портал клиентов
White-label личный кабинет для вашего клиента: обращения (тикеты), статусы сделок, документы и финансы его организации, согласование КП, чат с менеджером и запись на онлайн-звонки. Доступ включается изнутри CRM одним переключателем, а клиент открывает кабинет по персональной ссылке — в вашем бренде и фирменном цвете.
Назначение
Портал закрывает всю коммуникацию с клиентом в одном окне и снимает рутину с менеджеров. Раздел «Портал» внутри CRM — это пульт управления: здесь сотрудник видит входящие обращения, отвечает в чате, подтверждает брони звонков, ведёт базу знаний и включает/выключает доступ к кабинету для каждой организации. Сам клиент работает в отдельном кабинете (portal.html), оформленном в вашем бренде, и видит только данные своей компании — чужое ему недоступно (изоляция по токену).
Что делает
- Тикеты (обращения). Клиент создаёт обращение с темой, приоритетом и категорией — оно попадает в CRM со статусом «Открыт». Менеджер отвечает из карточки тикета, назначает ответственного, меняет категорию и приоритет. Виды: список и канбан (Открытые → Отвечены → Закрыты) с перетаскиванием.
- SLA первого ответа. Для каждого тикета считается время до первого ответа и сравнивается с нормой (часы SLA из настроек). Просрочка подсвечивается; фоновое задание шлёт уведомление, если открытый тикет висит без ответа дольше порога.
- Оценка закрытых тикетов. После закрытия клиент ставит оценку (1–5 звёзд) с комментарием. Средняя оценка выводится в аналитике и в самой строке тикета.
- Чат портала. Двусторонняя переписка «клиент ↔ менеджер» по каждой организации. Ответ менеджера может уходить клиенту письмом (если подключён ESP).
- Брони онлайн-звонков. Клиент выбирает свободный слот (дни/время задаются в настройках, занятые слоты скрыты), бронь появляется в CRM. Подтверждённую бронь одним кликом превращают в задачу-встречу; можно отметить «Проведён» или отменить.
- Статусы сделок для клиента. В кабинете во вкладке «Заказы» клиент видит свои открытые сделки и на каком этапе воронки каждая — прогресс-трекер в реальном времени.
- Согласование КП. Коммерческое предложение со статусом «На согласовании» клиент согласовывает или отклоняет с комментарием прямо в кабинете; менеджер получает уведомление, согласованное КП переходит в статус «Подписано».
- Документы и финансы. Клиент видит свои договоры, акты, счета и КП (со статусом и файлом, если загружен) и может нажать «Я оплатил» по счёту — это фиксирует заявку и уведомляет менеджеров (деньги в CRM при этом не двигаются, поступление проверяется вручную).
- База знаний. Опубликованные статьи видны клиенту в кабинете — меньше однотипных обращений. Черновики клиенту не показываются.
- Аналитика портала. Всего обращений, средний первый ответ против нормы SLA, средняя оценка, активные брони, распределение по клиентам и категориям.
- Управление доступом. На вкладке «Доступы» — карточка на каждую организацию: переключатель доступа к порталу и кнопка «Открыть портал клиента» по персональной ссылке.
Основные экраны и элементы
Внутри CRM раздел «Портал» открывается подменю из шести вкладок: Тикеты (список/канбан, фильтры по категориям, SLA-чипы, оценка), Чат портала (список компаний слева, переписка справа), Брони звонков (таблица слотов с действиями «В задачу / Проведён / Отменить»), База знаний (список статей, редактор с публикацией), Аналитика (плитки и графики) и Доступы (карточки организаций с переключателем и ссылкой). Кабинет клиента (portal.html) — отдельная страница со своими вкладками: Обзор, Заказы, Тикеты, База знаний, Документы, Финансы, Чат, Звонки; он окрашен в фирменный цвет и подписан названием вашего бренда, приветствие настраивается.
Как пользоваться — пошагово
- Откройте раздел Портал в CRM и перейдите на вкладку Доступы — там перечислены организации.
- Найдите нужную компанию и включите переключатель «Доступ к порталу» — кабинет активируется, для организации выдаётся персональная ссылка.
- Нажмите «Открыть портал клиента», чтобы проверить кабинет, и отправьте эту ссылку контактному лицу клиента (её же он использует для входа — отдельный пароль не нужен, вход по ссылке-токену).
- Заранее наполните Базу знаний: создайте статьи и переведите нужные в статус «Опубликована», чтобы клиент видел их в кабинете.
- Задайте фирменный цвет, приветствие и параметры слотов онлайн-звонков в настройках организации (портал) — кабинет подхватит бренд.
- Дальше работайте по входящим: отвечайте на Тикеты из их карточек (следя за SLA), общайтесь в Чате, подтверждайте Брони и при необходимости переводите их в задачи-встречи.
- Следите за качеством по Аналитике: средний первый ответ, средняя оценка закрытых тикетов, нагрузка по клиентам и категориям.
Взаимосвязи
- Через #companies — доступ и все данные портала привязаны к организации (companyId); контакт компании нужен, чтобы уведомлять клиента письмом.
- Через #deals — вкладка «Заказы» в кабинете показывает открытые сделки клиента и их этап в воронке.
- Через #documents — договоры, акты, счета и КП клиента; КП со статусом «На согласовании» клиент согласовывает в кабинете.
- Через #finance — счета клиента и отметка «Я оплатил» (заявка на сверку, без движения денег в CRM).
- Через #tasks — подтверждённую бронь звонка можно превратить в задачу-встречу.
- Через #mail и уведомления — ответы менеджера и события портала (новый тикет, оценка, согласование КП, отметка оплаты) уходят письмом/пушем подписанным сотрудникам.
- Через #settings — часы SLA, менеджер портала, фирменный цвет, приветствие, дни и время слотов, платёжные реквизиты берутся из настроек организации.
Под капотом (технически)
Доступ к кабинету описывается коллекцией portalAccess — по одной записи на организацию. Кабинет запрашивает данные через публичные роуты /api/portal/<token>/…: сервер по токену находит включённую запись доступа и собирает «срез» строго по её компании (тикеты, брони, документы, счета, открытые сделки с этапами, опубликованные статьи, чат, КП на согласовании). Клиентские действия (создать тикет, оценить, написать в чат, забронировать слот, согласовать КП, отметить оплату) идут через тот же токен и меняют соответствующие коллекции; каждое значимое событие пишется в журнал и рассылается подписанным сотрудникам. Ниже — ключевые коллекции и поля (концептуально).
| Коллекция | Ключевые поля | Назначение |
|---|---|---|
portalAccess | companyId, contactName, enabled, token | Запись доступа организации к кабинету + персональная ссылка |
tickets | id, companyId, author, title, text, category, priority, status, assigneeId, replies, internalNotes, attachments, firstReplyAt, rating, ratingComment | Обращения клиента: переписка, SLA первого ответа, оценка |
portalChats | по companyId → массив {from: client|manager, text, time} | Двусторонний чат кабинета |
bookings | id, companyId, date, time, topic, status (confirmed/done/cancelled) | Брони онлайн-звонков |
kbArticles | id, title, body, category, published, updatedAt | База знаний (клиенту видны только published) |
documents | type: offer/…, status: review/signed, clientDecision, clientComment, decidedAt | КП и документы; согласование КП клиентом |
invoices | number, amount, status, clientPaidClaim {at, note} | Счета клиента; отметка «Я оплатил» (сверка вручную) |
Модель безопасности: доступ к кабинету — по секретному токену в ссылке (без входа по паролю); данные отдаются только по включённой (enabled) записи и только по компании этого токена — чужие организации, весь график вендора и внутренние заметки наружу не попадают. Клиентские записи ограничиваются по длине, статусные переходы проверяются на сервере (например, повторно оценить или дважды отметить оплату нельзя). Уведомления клиенту письмом уходят только при подключённом ESP и наличии e-mail у контакта.
Аналитика
Сквозной раздел отчётности: считает воронку продаж, конверсию, выручку по месяцам и по менеджерам, средний чек, риски (просрочки и зависшие сделки) и ленту действий команды — всё по живым данным сделок, платежей и задач, без ручного ввода. Внутри две вкладки: «Обзор» и «KPI и планы» (описан отдельной темой ниже).

Назначение
Раздел «Аналитика» даёт руководителю и менеджеру единую картину продаж без выгрузок в Excel. Все числа пересчитываются на лету из тех же коллекций, что показывают «Сделки», «Финансы» и «Задачи», поэтому цифры в отчётах всегда совпадают с тем, что видно в самих разделах. Задача раздела — быстро ответить на вопросы «сколько сейчас в работе и на какую сумму», «как идёт конверсия», «кто из менеджеров сколько принёс» и «где команда рискует зависнуть».
Что делает
- Показывает шесть карточек-метрик: сделок в работе (и их сумма), выручка за месяц (поступления текущего месяца), конверсия в продажу, выиграно (число и сумма), новые заявки, сделки без задач.
- Рисует мини-графики (спарклайны) динамики за 7 последних месяцев: новые сделки, выручка, помесячная конверсия.
- Строит воронку выбранной схемы: сколько открытых сделок и на какую сумму стоит на каждом этапе.
- Считает выручку по менеджерам (кольцевая диаграмма) — сумма выигранных сделок по ответственному.
- Показывает выручку по месяцам столбиками (по дате закрытия/создания выигранных сделок).
- Выводит просрочку по сотрудникам: у кого сколько просроченных задач и «зависших» сделок (без открытых задач).
- Показывает ленту активности — последние 9 действий команды из коллекции
activity. - Каждая метрика кликабельна и ведёт в свой раздел: «сделки без задач» → в таблицу сделок с фильтром, строка сотрудника → в задачи, карточка «Мой план» → на вкладку KPI.
Основные экраны и элементы
Подвкладки сверху: «Обзор» и «KPI и планы» (у вкладки KPI появляется точка-индикатор, если на текущий месяц заданы планы). Сетка карточек (3 колонки): первые три карточки со спарклайнами, ниже — «Выиграно», «Новые заявки» и кликабельная «Сделки без задач». Сетка графиков: карточка «Мой план» (если у текущего пользователя задан план на месяц), «Воронка … — сделки по этапам» (горизонтальные полосы), «Выручка по менеджерам» (кольцо), «Просрочка по сотрудникам» (список с аватарами и счётчиками просрочек/зависших), «Выручка по месяцам» (столбцы), и во всю ширину — «Активность» (лента с автором, текстом и датой).
Как пользоваться — пошагово
- Откройте «Аналитика» в левом меню (группа «Учёт») или нажмите G, затем A.
- На вкладке «Обзор» посмотрите верхние карточки — это моментальный срез: работа, выручка, конверсия.
- Наведите курсор на спарклайн под карточкой, чтобы увидеть подпись динамики за 7 месяцев.
- Изучите воронку: длина полосы — число сделок на этапе, справа — количество и сумма. Схема воронки берётся из текущей выбранной в разделе «Сделки».
- По кольцу «Выручка по менеджерам» оцените вклад каждого; по «Выручке по месяцам» — сезонность.
- В блоке «Просрочка по сотрудникам» нажмите на строку сотрудника — откроется раздел «Задачи», чтобы разобрать хвосты.
- Нажмите карточку «Сделки без задач» — CRM перенесёт в таблицу сделок с включённым фильтром «рискуют зависнуть».
- Для целей и план/факта переключитесь на вкладку «KPI и планы» (см. тему ниже).
Взаимосвязи
- Со сделками через
#deals: воронка, конверсия, «выиграно», средний чек и «сделки без задач» считаются из коллекцииdeals; клик по «сделкам без задач» открывает их таблицу с фильтром. - С финансами через
#finance: «выручка за месяц» берётся из поступлений (payments, доход, статус «проведён»). - С задачами через
#tasks: «просрочка по сотрудникам» и «зависшие сделки» опираются наtasks; строки ведут в раздел задач. - С онлайн-звонками через
#meet: ближайшая встреча попадает в «Сводку дня» (см. дашборд), а не в саму аналитику. - С настройками через
#settings: набор этапов воронки, менеджеры (пользователи) и их цвета берутся из справочников и команды. - С KPI через
#kpi: карточка «Мой план» и вкладка «KPI и планы» используют коллекциюkpiPlans.
Под капотом (технически)
Экран собирает Views.analytics (js/views.js). Отдельной коллекции у обзора нет — метрики вычисляются на лету из deals, payments, tasks, leads, users. Лента действий хранится в коллекции activity; запись добавляет logActivity(text, dealId) (поля: id, date, userId, text, dealId).
| Метрика | Как считается |
|---|---|
| Сделок в работе | Количество и сумма deals со статусом open. |
| Конверсия в продажу | won / (won + lost) по числу закрытых сделок, в процентах. |
| Средний чек | Сумма выигранных сделок ÷ их количество. |
| Выручка за месяц | Сумма payments с kind = income, status = done за текущий месяц. |
| Спарклайны (7 мес.) | Новые сделки по createdAt; выручка по payments.date; конверсия — доля won среди закрытых за месяц. |
| Воронка | Открытые сделки текущей схемы (currentFunnelId), сгруппированные по stageId: количество и сумма. |
| Выручка по менеджерам | Сумма выигранных сделок в разрезе ownerId. |
| Просрочка / зависшие | По сотруднику: невыполненные tasks с due < сегодня; открытые сделки без активной задачи (isStuck). |
KPI и планы продаж
Цели по менеджерам на месяц и сравнение план/факт. Руководитель задаёт каждому сотруднику план по выручке, числу успешных сделок и звонкам; CRM подтягивает фактические результаты и показывает процент выполнения, прогноз на конец месяца и итог по отделу. Живёт на вкладке «KPI и планы» внутри «Аналитики».

Назначение
Раздел превращает абстрактные ожидания в измеримые цели. Для каждого менеджера на конкретный месяц задаётся план: сколько выручки принести, сколько сделок закрыть, сколько звонков сделать. Дальше CRM сама считает факт из реальных данных и показывает, кто в графике, кто отстаёт и успеет ли отдел выполнить план при текущем темпе. Факт выручки и сделок считается ровно так же, как «Выручка по менеджерам», поэтому цифры сходятся между отчётами.
Что делает
- Хранит планы по трём показателям на менеджера и месяц: выручка, успешные сделки, звонки.
- Считает факт из живых данных: выручка и сделки — по выигранным сделкам ответственного за месяц закрытия; звонки — по состоявшимся звонкам.
- Рисует полосу выполнения и процент плана у каждого показателя (цвет: зелёный ≥100%, жёлтый — средне, красный — мало).
- Даёт прогноз на конец месяца линейной экстраполяцией по прошедшим дням (только для текущего месяца, не раньше 3-го числа).
- Показывает сводку по отделу: суммарный план, факт, процент, сделки план/факт и общий прогноз.
- Позволяет перелистывать месяцы вперёд/назад и вернуться к текущему одной кнопкой.
- Даёт задать/изменить/убрать план сотруднику (право
kpiPlans) и скопировать планы прошлого месяца одной кнопкой. - На вкладке «Обзор» дублирует персональную карточку «Мой план» для текущего пользователя.
Основные экраны и элементы
Тулбар сверху: стрелки «предыдущий/следующий месяц», название месяца, кнопка «Текущий» (если открыт не текущий месяц) и — при наличии прав и планов в прошлом месяце — кнопка «Скопировать планы прошлого месяца». Сводка по отделу (появляется, если у отдела задан план по выручке): карточки «План отдела», «Факт» (с процентом), «Сделки» (факт/план) и «Прогноз месяца». Таблица по сотрудникам: аватар и роль, план и факт выручки, полоса «%», сделки (факт/план), звонки (факт/план), пилюля прогноза (↑/↓ и процент) и кнопка «Задать план»/«Изменить план». Строка «Отдел» в подвале суммирует показатели. Модалка плана: три поля (выручка, успешные сделки, звонки) и кнопка «Убрать план». Внизу — пояснение методики расчёта.
Как пользоваться — пошагово
- Откройте «Аналитика» и переключитесь на вкладку «KPI и планы».
- Стрелками выберите нужный месяц (по умолчанию — текущий); кнопка «Текущий» вернёт к нему.
- Напротив сотрудника нажмите «Задать план» — откроется окно с полями выручки, сделок и звонков.
- Заполните хотя бы один показатель и нажмите «Сохранить» — в таблице появятся план, полоса выполнения и прогноз.
- Если планы прошлого месяца подходят, нажмите «Скопировать планы прошлого месяца» — цели перенесутся всем, у кого их ещё нет.
- В течение месяца следите за полосой «%» и пилюлей прогноза: ↑ зелёная — успевает, ↓ красная — отстаёт.
- Смотрите строку «Отдел» и карточку «Прогноз месяца», чтобы оценить, выполнит ли команда план в целом.
- Чтобы поправить цель — «Изменить план»; чтобы снять — в окне плана нажмите «Убрать план».
Взаимосвязи
- С аналитикой через
#analytics: вкладка живёт внутри «Аналитики», а факт выручки совпадает с блоком «Выручка по менеджерам». - Со сделками через
#deals: факт выручки и сделок — из выигранныхdealsответственного за месяц закрытия. - Со звонками через
#calls: фактические звонки — из коллекцииcalls(состоявшиеся,status = done). - С настройками через
#settings: список менеджеров — команда пользователей; право на правку планов —kpiPlans(по умолчанию у роли «Руководитель»). - С дашбордом через
#dashboard: индикатор-точка на вкладке KPI и карточка «Мой план» помогают не забыть про цели.
Под капотом (технически)
Планы хранятся в коллекции kpiPlans (синхронизируется через /api/state, серверная категория прав config). Рендер — renderKpiTab / wireKpiTab / openKpiModal (js/views.js). Факт считает kpiFactsOf(userId, month), процент — kpiPct, прогноз — kpiForecastPct (экстраполяция факт / прошедшие дни × всего дней ÷ план, только для текущего месяца и с 3-го числа).
Поле kpiPlans | Значение |
|---|---|
id | Идентификатор записи плана. |
month | Месяц плана в формате ГГГГ-ММ. |
userId | Менеджер, которому задан план. |
revenue | План по выручке (сумма закрытых сделок), ₽. |
dealsWon | План по числу успешных сделок. |
calls | План по числу звонков. |
Дашборд и сводка дня
Сквозной «командный мостик» CRM: «Сводка дня» при входе, центр уведомлений под колокольчиком, глобальный поиск и командная палитра (⌘K), индикаторы «кто сейчас онлайн» и горячие клавиши. Эти элементы не отдельный раздел меню, а верхний слой, доступный из любого экрана.

Назначение
Дашбордный слой отвечает на вопрос «что мне делать прямо сейчас» и помогает мгновенно перемещаться по системе. «Сводка дня» встречает пользователя короткой выжимкой хвостов (задачи, заявки, неоплаченные счета, ближайшая встреча). Центр уведомлений собирает созревшие напоминания, просрочки и ленту событий команды. Глобальный поиск и командная палитра дают попасть в любую запись или раздел за пару нажатий, а индикаторы присутствия показывают, кто из коллег сейчас в системе.
Что делает
- Показывает «Сводку дня» — раз в сутки при входе: приветствие по времени суток и строки-хвосты, каждая ведёт в свой раздел; автозакрытие через 20 секунд.
- Ведёт центр уведомлений под колокольчиком с двумя вкладками: «Напоминания» (созревшие напоминания, просрочки, новые заявки) и «События» (лента действий команды).
- Показывает бейдж со счётчиком созревших напоминаний и шлёт браузерное уведомление и всплывающую подсказку, когда срабатывает напоминание.
- Даёт глобальный поиск (поле сверху или клавиша «/») по сделкам, контактам, компаниям, задачам, документам, заявкам, товарам, тикетам, письмам и процессам, плюс «недавно просмотренные».
- Открывает командную палитру (⌘K / Ctrl+K): навигация по разделам и быстрые команды «Создать …», управление с клавиатуры (стрелки, Enter).
- Показывает присутствие: зелёная точка на аватаре у тех, кто активен последние 5 минут (данные едут вместе с синхронизацией).
- Поддерживает горячие клавиши: ⌘K, «/», N (меню «Создать»), D/T/C (создать сделку/задачу/контакт), G→буква (переход в раздел), «?» (шпаргалка), Esc (закрыть).
- Работает с русской раскладкой: буквы хоткеев распознаются и по кириллице.
Основные экраны и элементы
Верхняя панель: поле глобального поиска (открывает выпадающую панель результатов по группам), колокольчик уведомлений с числовым бейджем, аватары онлайн-коллег с зелёной точкой. «Сводка дня» — всплывающая карточка справа сверху с приветствием и строками (иконка, заголовок, подпись, стрелка); тон строки краснеет при просрочках. Центр уведомлений — поповер с вкладками «Напоминания»/«События»; у напоминаний есть кнопки «+10 мин», «Готово», «Прочитано». Командная палитра — модальное окно с полем ввода, списком команд и подсказкой хоткеев в подвале. Модалка «Горячие клавиши» (клавиша «?») — шпаргалка со всеми сочетаниями. Стартовый экран приложения по умолчанию — раздел «Сделки».
Как пользоваться — пошагово
- При входе прочитайте «Сводку дня» и кликните любую строку, чтобы перейти к делам (или закройте крестиком/Esc — она сама скроется через 20 сек).
- Нажмите колокольчик: на вкладке «Напоминания» отметьте сработавшие как «Готово» или отложите на «+10 мин»; на вкладке «События» просмотрите, что делала команда.
- Нажмите «/» или кликните поле поиска, начните вводить название — в панели появятся результаты по группам; клик открывает запись, Enter фильтрует текущий раздел.
- Нажмите ⌘K (Ctrl+K), чтобы открыть палитру: наберите раздел или «создать …», выбирайте стрелками ↑/↓ и подтверждайте Enter.
- Для быстрого перехода нажмите G, затем букву раздела (например, G→A — «Аналитика»); одиночные D/T/C создают сделку/задачу/контакт.
- Наведитесь на аватар с зелёной точкой, чтобы понять, кто из коллег сейчас онлайн.
- Забыли сочетание — нажмите «?», откроется шпаргалка горячих клавиш.
Взаимосвязи
- С задачами через
#tasks: напоминания, просрочки и «на сегодня» в сводке и уведомлениях берутся изtasks. - С заявками через
#leads: новые заявки попадают и в сводку дня, и в напоминания. - С финансами через
#finance: неоплаченные счета старше недели выводятся строкой сводки. - С онлайн-звонками через
#meet: ближайшая запланированная встреча показывается в сводке дня. - С аналитикой через
#analytics: лента «События» и обзорная «Активность» используют одну коллекциюactivity. - Со всеми разделами через глобальный поиск и палитру: они умеют открыть любую запись (сделку, контакт, документ и т.д.) и перейти в любой раздел меню.
- С настройками через
#settings: команда пользователей и права определяют, кого видно онлайн и какие команды «Создать» доступны в палитре.
Под капотом (технически)
Логика собрана в js/app.js и js/ui.js. Отдельной коллекции «дашборд» нет — всё считается по живым данным. «Сводка дня»: dailyDigestRows / showDailyDigest, показ не чаще раза в сутки (ключ ab_daily в localStorage). Центр уведомлений: notifRemindersHTML / notifEventsHTML, бейдж — refreshRemindBadge, движок напоминаний тикает раз в 30 сек. Поиск: globalSearchResults (по 4 совпадения на тип); палитра: cmdkCommands / cmdkRender. Хоткеи навигации — карта HK_NAV, разделы — массив SECTIONS. Присутствие: множество Store.online, отрисовка — paintPresence и avatarHTML(user, cls, true).
| Механизм | Как устроено |
|---|---|
| Сводка дня | Строки из tasks (сегодня/просрочка), новых leads, неоплаченных invoices старше 7 дней, ближайшей meetings; показ раз в сутки. |
| Напоминания | ripeReminders() — задачи с созревшим remindAt; бейдж = их число; браузерное уведомление при срабатывании. |
| Присутствие (online) | Сервер отдаёт активных за окно 5 минут (onlineUserIds, PRESENCE_WINDOW); presence едет в /api/state и /api/revs при поллинге каждые 15 сек. |
| Глобальный поиск | Ищет по deals, contacts, companies, tasks, documents, leads, products, tickets, emails, processes; при пустом запросе — recentViews. |
| Палитра ⌘K | Команды навигации по SECTIONS + «Создать …» по доступным правам; при вводе — фильтр команд и подмешивание результатов поиска. |
| Хоткеи | HK_NAV (G→буква), одиночные D/T/C/N, «/», «?»; кириллица маппится в латиницу таблицей RU_LAT; блокируются в полях ввода и при открытом окне/карточке. |
Настройки
Раздел «Настройки» — центр управления всей CRM: сотрудники и их роли, реквизиты организации, единые справочники, свои поля, воронки продаж, интеграции, уведомления, корзина, журнал действий и импорт/экспорт данных. Здесь задаётся всё, что потом подсказывается и применяется в остальных разделах.
Назначение
Настроить CRM под свою компанию один раз — и дальше система будет подставлять правильные значения, применять права и оформлять документы автоматически. Настройки — это «правила игры» для всех остальных разделов: от валюты и рабочей недели до состава справочников и кастомных полей в карточках.
Что делает
- Управляет сотрудниками: добавление, смена роли, сброс пароля, отключение доступа (только администратор).
- Хранит реквизиты организации (название, ИНН, телефон, юр. адрес, валюта) — они попадают в сайдбар, счета, КП и подписи.
- Задаёт рабочую неделю и рабочие часы — по ним считаются сроки, слоты звонков и SLA.
- Настраивает клиентский портал: менеджер, приветствие, реквизиты оплаты, акцентный цвет кабинета, слоты и горизонт брони.
- Ведёт единые справочники (теги сделок, категории товаров, роли сотрудников), которые подсказываются в формах по всей системе.
- Позволяет создавать свои (кастомные) поля для сделок, контактов и компаний.
- Управляет воронками и их этапами.
- Показывает статус интеграций (Telegram, WhatsApp, формы сайта, телефония, почта, банк).
- Настраивает уведомления: web-push, календарный фид (iCalendar), каналы доставки и типы событий.
- Хранит корзину удалённых объектов с восстановлением в один клик.
- Импортирует контакты, компании и сделки из CSV/Excel с сопоставлением колонок и экспортирует данные в CSV.
Основные экраны и элементы
Сотрудники (team). Таблица команды: имя, email, роль, статус (активен/отключён), время последнего входа, число открытых сделок и задач. Администратор видит кнопку «+ Сотрудник» и меню у каждой строки: «Сбросить пароль», «Сменить роль», «Включить/Отключить доступ». Внизу — сводка: сотрудников, активных, ролей.
Организация (org). Две карточки. «Бренд и валюта»: название компании, символ валюты, ИНН, телефон, юр. адрес, рабочая неделя (галочки дней) и часы, срок хранения корзины. «Портал клиентов»: менеджер портала, приветствие в кабинете, реквизиты для оплаты, акцентный цвет портала, слоты звонков и горизонт брони. Кнопка «Сохранить настройки» видна тем, у кого есть права; остальным поля доступны только на просмотр.
Справочники (dicts). Три списка-чипа: «Теги сделок», «Категории товаров», «Роли сотрудников». Значения добавляются по Enter и удаляются крестиком. Эти значения подсказываются в формах: теги — в сделке, категории — в товаре, роли — при создании сотрудника. Роль, которую используют сотрудники, удалить нельзя, пока их не переназначат.
Поля (cfields). Свои поля для сделок, контактов и компаний. Для каждого поля — название, тип (текст, число, деньги, дата, список, мультисписок, да/нет, ссылка, телефон, email и др.), варианты (для списков), признаки «обязательное» и «в таблице», порядок и счётчик заполненных записей. Поля появляются в формах и карточках, а отмеченные «в таблице» — колонками в реестрах и в CSV-экспорте.
Воронки (funnels). Список воронок с их этапами и числом открытых сделок на каждом. Можно создать воронку, переименовать, отредактировать этапы и удалить (только пустую и не последнюю).
Интеграции (integrations). Карточки внешних каналов: Telegram, WhatsApp, формы сайта (активны в демо), IP-телефония, почта, банк. В демо-режиме показывают статус и подсказку.
Уведомления (notify). Web-push (напоминания задач системными уведомлениями браузера, свои VAPID-ключи), календарный фид iCalendar (секретная ссылка для Яндекс/Mail.ru-календаря с возможностью перегенерации), каналы доставки (почта, мессенджеры) и выбор типов событий, о которых сообщать. Есть кнопка «Отправить тест».
Корзина (trash). Таблица удалённых объектов: имя, тип, когда и кем удалён. Кнопки «Восстановить» и «Удалить навсегда», а также «Очистить корзину». Сделка восстанавливается вместе со своими задачами.
Журнал (audit). Виден только администратору. Лента действий: входы, правки, экспорт, создание сотрудников, сброс пароля и т.д., с экспортом в CSV. Подробнее — в разделе «Роли, права, история, корзина».
Данные (data). Сброс к демо-данным (только администратор), импорт из CSV/Excel (контакты, компании, сделки — по правам) и ссылка на UI Kit (библиотеку компонентов).
Как пользоваться — пошагово
- Заполните организацию. Вкладка «Организация» → впишите название, валюту, ИНН, телефон и юр. адрес → отметьте рабочие дни и часы → «Сохранить настройки». Название сразу появится в сайдбаре.
- Добавьте сотрудников. Вкладка «Сотрудники» → «+ Сотрудник» → укажите имя, email и роль. Роль определяет, какие разделы человек сможет менять.
- Наполните справочники. Вкладка «Справочники» → добавьте нужные теги сделок и категории товаров → при необходимости заведите свои роли.
- Настройте свои поля. Вкладка «Поля» → выберите сущность (сделки/контакты/компании) → «Добавить поле» → задайте тип и, если нужно, отметьте «в таблице».
- Проверьте воронки. Вкладка «Воронки» → отредактируйте этапы под свой процесс продаж.
- Включите уведомления. Вкладка «Уведомления» → «Включить уведомления», при желании подпишитесь на календарный фид и выберите каналы и события.
- Импортируйте базу. Вкладка «Данные» → выберите «Контакты/Компании/Сделки» → загрузите CSV или вставьте таблицу из Excel → сопоставьте колонки с полями → выберите режим для дубликатов → импортируйте.
- Экспорт и восстановление. CSV выгружается из реестров и журнала; удалённое возвращается из вкладки «Корзина».
Взаимосвязи
- Справочники и свои поля применяются в контактах и компаниях и в сделках — подсказки тегов, категорий и колонки в реестрах.
- Кастомные поля описаны отдельно в теме о полях и участвуют в карточках и CSV-экспорте.
- Роли и права из «Сотрудников» раскрываются в теме «Роли, права, история, корзина».
- Реквизиты организации уходят в печатные формы счетов и КП раздела документов и финансов.
- Рабочая неделя, слоты и менеджер портала связывают настройки с клиентским порталом и календарём.
Под капотом (технически)
Настройки хранятся в нескольких коллекциях состояния (синхронизируются через /api/state): users (сотрудники), orgSettings (реквизиты, рабочая неделя, портал, справочники), customFields (свои поля), funnels (воронки), trash (корзина), history (история правок). Импорт/экспорт работает целиком на клиенте: парсер CSV понимает разделители «,», «;» и таб, экранирование кавычек и CRLF, а также автоматически распознаёт кодировку UTF-8 или Windows-1251. Мастер импорта сам угадывает соответствие колонок по заголовкам, а при дубликатах предлагает пропускать или обновлять записи.
| Коллекция | Ключевые поля | Назначение |
|---|---|---|
users | id, name, email, role, active, last_login | Сотрудники, их роли и статус доступа |
orgSettings | brand (name, currency, inn, phone, address), workweek, trash.days, portal, dicts | Реквизиты, рабочая неделя, портал, единые справочники |
customFields | id, entity, name, type, options, required, showInTable, order | Свои поля для сделок/контактов/компаний |
funnels | id, name, stages[] (id, name, color) | Воронки продаж и их этапы |
trash | id, entityType, name, data, related, deletedAt, deletedBy | Удалённые объекты для восстановления |
Доступ к редактированию каждой вкладки определяется правами роли: например, реквизиты и справочники правит только тот, у кого есть право на настройки организации, а импорт в раздел доступен, если у роли есть права на этот раздел. Права проверяются и в интерфейсе (скрытием кнопок), и на сервере при сохранении — подробнее в теме «Роли, права, история, корзина».
Роли, права, история, корзина
Как в АэроБокс устроена безопасность и доверие к данным: роли определяют, какие разделы сотрудник может менять; история фиксирует, кто и что поменял в карточках; журнал хранит действия по всей команде; корзина возвращает удалённое. Всё это защищает данные от случайных потерь и делает работу прозрачной.
Назначение
Дать каждому сотруднику ровно те возможности, которые нужны его роли, и при этом сохранить полную прослеживаемость: любое изменение можно увидеть, а удалённое — вернуть. Права не только скрывают лишние кнопки, но и защищаются на сервере, поэтому доступ нельзя расширить в обход интерфейса.
Что делает
- Назначает роли сотрудникам и определяет по ролям, какие разделы можно менять.
- Скрывает недоступные действия в интерфейсе и повторно проверяет права на сервере при сохранении.
- Ведёт историю изменений карточек: кто, что и когда поменял (было → стало).
- Ведёт журнал действий по всей команде: входы, правки, экспорт, операции с сотрудниками.
- Хранит удалённые объекты в корзине заданный срок и восстанавливает их вместе со связанными записями.
- Ограничивает число одновременных сессий, чтобы доступ оставался под контролем.
Основные экраны и элементы
Роли и права. Роль сотрудника задаётся во вкладке «Сотрудники» (меню строки → «Сменить роль»). Готовые роли — «Администратор», «Руководитель отдела продаж», «Менеджер продаж», «Финансист», «Маркетолог»; можно завести и свои роли в справочнике. Каждая роль открывает набор доменов (продажи, финансы, каталог, маркетинг, портал, конфигурация), а все сотрудники всегда имеют базовые права (задачи, коммуникации, журнал активности, история, проекты). Кастомная роль получает только базовые права — безопасный дефолт.
История изменений. Показывается на вкладке «История» внутри карточек сделки, контакта, компании и документа. Это лента: «сотрудник изменил(а): поле — было → стало», с датой и временем. Диффы считаются и для обычных, и для кастомных полей.
Журнал (аудит). Отдельная вкладка «Журнал» в «Настройках», видна только администратору. Таблица: когда, кто, действие (вход, неверный пароль, изменение данных, смена пароля, создание/изменение сотрудника, сброс пароля, сброс данных, тикет из портала и др.) и детали. Есть экспорт журнала в CSV.
Корзина. Вкладка «Корзина» в «Настройках». Список удалённых объектов с типом, датой и автором удаления. Действия: «Восстановить», «Удалить навсегда», «Очистить корзину». Восстановление доступно только в те разделы, куда у роли есть права.
Сессии. Число одновременных сессий пользователя ограничено; старые входы вытесняются, чтобы доступ нельзя было бесконтрольно размножать.
Как пользоваться — пошагово
- Назначьте роли. «Настройки» → «Сотрудники» → меню сотрудника → «Сменить роль». Выберите роль, соответствующую его зоне ответственности.
- Проверьте доступ. Если у сотрудника не видно кнопок создания или сохранения в разделе — значит, его роль не даёт прав на этот раздел. Расширьте роль или смените её.
- Смотрите историю. Откройте карточку сделки/контакта/компании → вкладка «История» → увидите, кто и что менял.
- Проверяйте журнал. Администратор: «Настройки» → «Журнал» → просмотрите входы и правки по всей команде, при необходимости выгрузите CSV.
- Восстанавливайте удалённое. «Настройки» → «Корзина» → «Восстановить» у нужного объекта (пока не истёк срок хранения).
- Отключайте доступ. Уволенному сотруднику отключите доступ в «Сотрудниках» вместо удаления — история его действий сохранится.
Взаимосвязи
- Роли назначаются во вкладке «Сотрудники» темы «Настройки», а список ролей ведётся в справочниках.
- История изменений встроена в карточки сделок, контактов и компаний и документов.
- Права ограничивают, что можно менять в каждом разделе — см. общую архитектуру и синхронизацию.
- Корзина возвращает объекты в их исходные разделы, включая связанные задачи сделки.
Под капотом (технически)
Модель прав построена по разделам: у каждой роли есть набор доменов, а домен раскрывается в список коллекций, которые роль может записывать. Все сотрудники получают общую базу (задачи, коммуникации, история и т.п.); известным ролям сервер добавляет расширенные домены, а неизвестной (кастомной) роли — только базу. Проверка прав двухуровневая: интерфейс скрывает недоступные действия, а сервер при сохранении состояния сверяет каждую коллекцию с правами роли — то, на что прав нет, просто не принимается и отмечается в аудите. Именно поэтому доступ нельзя расширить, обойдя интерфейс.
| Домен | Что открывает (примеры разделов) |
|---|---|
| Продажи | Сделки, заявки, контакты, компании |
| Финансы | Платежи, счета, движение денег, счета учёта |
| Каталог | Товары, документы |
| Маркетинг | Подписчики, рассылки, автоматизации, заявки |
| Портал | Тикеты, чаты портала, брони, база знаний |
| Конфигурация | Воронки, автоматизации, процессы, настройки, свои поля, планы |
| База (все роли) | Задачи, активность, чаты, письма, звонки, история, проекты |
Коллекции контроля. users (роли и доступ), permissions (набор прав, отдаётся клиенту при входе), history (правки карточек: entity, entityId, userId, ts, changes[]), trash (удалённое с автором и датой), orgSettings и customFields (настройки под правами конфигурации). Журнал действий ведётся на сервере отдельно и фиксирует входы, изменения данных, отказы по правам, операции с сотрудниками и экспорт. Корзина хранит объекты ограниченный срок (по настройке организации), после чего они удаляются безвозвратно; при восстановлении вместе с объектом возвращаются связанные записи.
Архитектура системы
«АэроБокс» — это единое веб-приложение с реальным бэкендом: компактный Node-сервер без внешних зависимостей, встроенная база данных SQLite и отдаваемая рядом статика. Фронтенд — одностраничное приложение (SPA) на «ванильном» JavaScript без фреймворков и сборки, с тёмной темой по умолчанию и режимом PWA. Всё состояние компании живёт на сервере, а браузеры синхронизируются с ним через два эндпоинта, ревизии коллекций и оптимистичное слияние изменений.
Общая схема
Система состоит из трёх слоёв. Сервер (server/server.js) — один Node-процесс, обычный HTTP-сервер на стандартной библиотеке, без npm-зависимостей: он маршрутизирует запросы, отдаёт статику, обслуживает API, аутентификацию, публичные каналы и фоновые движки. Хранилище — SQLite через встроенный в Node модуль (обёртка server/db.js): пользователи, сессии, бизнес-данные (в виде именованных коллекций с ревизиями), журнал аудита, вложения и служебные ключи. Фронтенд — статические файлы (index.html + модули js/app.js, js/data.js, js/ui.js, js/views.js, js/views2.js), которые сервер отдаёт как обычные ресурсы; версионирование ассетов делается суффиксом ?v=N, чтобы браузер гарантированно забирал свежие файлы после обновления. Приложение работает как PWA (манифест + сервис-воркер), поэтому доступно с телефона и переживает кратковременные обрывы сети.
К серверу пристыкованы отдельные модули-движки, включаемые по конфигурации окружения: imap.js и smtp.js — приём и отправка почты, esender.js — интеграция с внешним email-провайдером (ESP) для рассылок и транзакционных писем, caldav.js — синхронизация календаря, meet.js — онлайн-звонки. Все они работают вокруг одного общего хранилища и того же слоя данных, что и остальная CRM.
Модель данных и синхронизация
Бизнес-данные организованы как набор именованных коллекций — единый список из ~37 коллекций объявлен на сервере (SERVER_COLLECTIONS в server/db.js) и зеркально на клиенте (SERVER_COLLECTIONS в js/data.js), чтобы обе стороны знали один и тот же набор. Каждая коллекция хранится в SQLite отдельной строкой со своими данными и номером ревизии (rev).
Чтение состояния идёт запросом GET /api/state: сервер возвращает текущего пользователя, список коллег, все коллекции, их ревизии, права записи текущей роли (permissions.write) и список активных онлайн-коллег. Клиент раскладывает это в единое хранилище Store и строит индексы для быстрого рендера. Запись изменений идёт запросом PUT /api/state (в интерфейсе — «сохранение изменений»): на сервер уходят только те коллекции, которые реально поменялись, вместе с их базовыми ревизиями (baseRevs). Сохранение дебаунсится — накопленные правки отправляются одним пакетом.
Оптимистичная синхронизация. Сервер принимает изменение коллекции, только если присланная базовая ревизия совпадает с текущей; принятая коллекция получает ревизию на единицу больше. Если за это время коллекцию успел записать кто-то другой, возникает конфликт (ответ 409): сервер возвращает свежие данные, а клиент выполняет трёхстороннее слияние (база / своё / чужое) и повторяет попытку. Так несколько сотрудников могут править разные записи параллельно без затирания чужой работы.
Права на запись (writableFor). Клиент никогда не является источником прав: набор коллекций, доступных роли на запись, вычисляет сервер (writableFor(role)) из общей базы (задачи, коммуникации, журнал) плюс доменных наборов (продажи, финансы, каталог, маркетинг, портал, конфигурация). При сохранении сервер молча отбрасывает коллекции, запись в которые роли не положена, и возвращает их в списке denied — клиент откатывает такие изменения к серверному состоянию и показывает уведомление. Незнакомой (кастомной) роли по умолчанию доступна только общая база — безопасный минимум.
| Коллекция | Назначение |
|---|---|
funnels | Воронки продаж и их этапы |
companies | Компании (организации-контрагенты) |
contacts | Контакты (люди) |
deals | Сделки |
tasks | Задачи |
cashflowItems | Статьи движения денежных средств (ДДС) |
accounts | Счета учёта (кассы/расчётные счета) |
payments | Платежи (поступления и списания) |
invoices | Счета на оплату |
products | Товары и услуги (каталог) |
chats | Внутренние чаты/переписка команды |
activity | Лента активности и событий |
leads | Заявки (входящие лиды) |
documents | Документы (договоры, акты, счета, КП) |
portalAccess | Доступы клиентского портала (токены компаний) |
tickets | Обращения/тикеты поддержки |
portalChats | Переписка с клиентами в портале |
bookings | Записи на встречи/слоты из портала |
automations | Автоматизации (правила и триггеры) |
emails | Почтовые письма (входящие/исходящие) |
calls | Звонки и их история |
subscribers | Подписчики email-рассылок |
campaigns | Рассылочные кампании |
mailAutomations | Цепочки писем (email-автоматизации) |
processes | Бизнес-процессы (шаблоны) |
processRuns | Запуски (экземпляры) бизнес-процессов |
trash | Корзина удалённых записей (восстановимо) |
scenarios | Сценарии (заготовки действий/автоматизаций) |
orgSettings | Настройки организации (бренд, график, портал, словари) |
meetings | Онлайн-звонки и видеовстречи |
customFields | Кастомные поля разделов |
kpiPlans | KPI и планы сотрудников/отделов |
history | История изменений записей |
emailTemplates | Шаблоны email-писем |
kbArticles | Статьи базы знаний (в т. ч. для портала) |
projects | Проекты (иерархия проектов и вех) |
projectGroups | Группы проектов и их публичные витрины |
Часть пользовательских предпочтений (текущая воронка, недавно просмотренное) хранится не на сервере, а локально в браузере — это UI-состояние, не общие данные компании.
Аутентификация и сессии
Вход выполняется по email и паролю (запрос на /api/login). Пароли на сервере хранятся не в открытом виде, а как соль + хэш (алгоритм scrypt); проверка пароля идёт с постоянным временем сравнения, а при неизвестном email сервер всё равно прогоняет проверку по фиктивному хэшу — чтобы время ответа не выдавало, существует ли такой аккаунт. При успешном входе создаётся серверная сессия, а клиенту выдаётся защищённая cookie ab_s (HttpOnly, SameSite) — сам токен сессии в JavaScript недоступен. Сессии живут в БД, имеют срок годности и отметку последней активности (по ней же считаются «онлайн»-коллеги). Число одновременных сессий одного пользователя ограничено: самые старые вытесняются. Выход (/api/logout) удаляет текущую сессию и сбрасывает cookie; смена пароля или отключение пользователя администратором принудительно завершает все его сессии на всех устройствах. Все входы, неудачные попытки и ключевые действия пишутся в журнал аудита.
Безопасность
- Заголовки безопасности на всех ответах: строгая Content-Security-Policy (запрет внешних скриптов и утечки данных, закрытый фрейминг), запрет угадывания типа контента, запрет встраивания в чужие страницы, аккуратная политика реферера; на защищённом соединении добавляется HSTS.
- Ограничение частоты запросов (rate limiting) на чувствительных точках: вход, публичные формы, разблокировка витрин, вебхуки, портал — чтобы гасить перебор и злоупотребления.
- Защита от брутфорса входа: учёт неудачных попыток по IP и по аккаунту с временной блокировкой, выравнивание времени ответа против перебора существующих email.
- Изоляция публичных каналов: клиентский портал и витрины проектов отдают строго срез данных только «своей» компании/группы — чужие записи, весь график вендора и служебные поля наружу не попадают. Публичные ответы помечаются как неиндексируемые и не кэшируются.
- Санитизация данных наружу: пользователи и группы отдаются через «безопасные» проекции (только разрешённые поля) — хэши паролей, внутренние токены и служебные атрибуты в публичный/клиентский ответ не включаются.
- Защита от SSRF: адреса, на которые сервер сам делает исходящие запросы (например, push-уведомления), проверяются по белому списку доверенных сервисов; IP-литералы, приватные, локальные и метадата-хосты отклоняются.
- Проверка серверных прав на запись: полномочия роли определяет только сервер; клиент не может записать коллекцию, недоступную его роли.
- Проверка вебхуков внешних сервисов по подписи и ограничение доступа к файлам портала строго по принадлежности документа компании.
- Изоляция статики: служебные каталоги (сервер, БД, документация, конфигурация) недоступны для отдачи как статические файлы.
Каналы наружу
Помимо основного интерфейса система публикует несколько ограниченных внешних каналов. Витрина группы проектов — публичная ссылка вида /s/<token>: сервер отдаёт отдельную страницу, которая по токену из URL и паролю получает read-only срез только выбранных проектов (эндпоинты /api/share/<token>). Клиентский портал (/api/portal/<token>) — личный кабинет компании-клиента: заказы, счета, документы, тикеты, база знаний и запись на встречи, где каждый токен видит данные только своей компании. Публичная форма приёма заявок принимает лиды с защитой от спама (rate limit + honeypot + жёсткая валидация). Наконец, вебхуки ESP (email-провайдера, /api/esender/webhook) принимают события о доставке/открытиях писем — с проверкой подписи и ограничением частоты.
Развёртывание
Приложение разворачивается как один Node-процесс, запускаемый как системный сервис (демон), рядом лежат статические файлы фронтенда и файл базы SQLite. Внешних зависимостей нет — достаточно среды Node нужной версии. Порт, режим (dev/prod) и параметры интеграций (почта, ESP, календарь, push) задаются переменными окружения; при первом запуске база при необходимости сидируется и мигрируется. В продуктивной среде процесс работает за TLS, что включает дополнительные меры (HSTS). Конкретные хосты, команды и пути прод-окружения в этом документе не приводятся.
Взаимосвязи
- Все разделы читают и пишут общие коллекции через единый механизм /api/state; какие коллекции доступны роли на запись — определяют Роли.
- Набор коллекций и поведение по умолчанию (бренд, график, словари) задаются в Настройках организации (коллекция
orgSettings). - Публичные каналы отдают срезы из тех же коллекций: витрина — из
projects/projectGroups(см. Проекты), портал — изtickets,documents,bookingsи др. (см. Клиентский портал). - Почта, рассылки, календарь и звонки работают поверх того же хранилища через движки
imap/smtp/esender/caldav/meet. - Ключевые действия и входы фиксируются в журнале — см. Аудит и безопасность.
Интеллектуальная собственность ООО «АэроБокс» © 2026. Все права защищены. Версия v0.01