Fairflow — Полная спецификация бизнес-процесса (v5.2)¶
Цель документа: описать систему Fairflow как проектно-центричную модульную CRM-платформу с чётким разделением ролей, типов аккаунтов, доступов и настраиваемых бизнес-процессов. Документ описывает только бизнес-логику — без привязки к конкретной реализации frontend или backend.
Версия: 5.2 Статус: рабочий черновик
1. Общее описание системы¶
Fairflow — проектно-центричная модульная CRM-платформа, в которой вся работа с клиентами, сделками и данными организована вокруг проектов. Проект является основной единицей изоляции данных и масштабирования.
1.1 Ключевые принципы¶
- Проект = центр всего. Все CRM-данные живут внутри проекта и изолированы от других проектов.
- Модульность. Каждый проект включает только нужные модули. Ненужные отключаются.
- Deal-centric продажи. Единая сущность «Сделка» движется по настраиваемой воронке. Лиды, заявки, продажи — это стадии, а не отдельные сущности.
- Order-centric исполнение. Тип продукта определяет процесс оформления (тип продажи): поля, этапы, документы, интеграции.
- Чистая база. Контакты и компании создаются явно, не автоматически из каждого обращения.
- Каждая запись имеет владельца. Сущности всегда привязаны к человеку или отделу — никогда не висят «ни у кого».
1.2 Два режима работы¶
- Индивидуальный — физическое лицо использует платформу самостоятельно или с приглашёнными участниками.
- Корпоративный — организация (юридическое лицо) использует платформу как рабочее пространство для команды сотрудников.
2. Глоссарий¶
| Термин | Определение |
|---|---|
| Пользователь (User) | Физическое лицо, зарегистрированное в системе. Имеет один аккаунт. |
| Аккаунт (Account) | Учётная запись пользователя. Всегда принадлежит физическому лицу. |
| Организация (Organization) | Юридическое лицо / ИП. Корпоративное рабочее пространство с сотрудниками и лицензиями. |
| Пространство (Workspace) | Контекст владения проектами: личное пространство пользователя или пространство организации. |
| Проект (Project) | Центральная сущность системы. Все CRM-данные привязаны к проекту. Имеет настраиваемый набор модулей. |
| Модуль (Module) | Функциональный блок CRM, включается/выключается per-project. |
| Сделка (Deal) | Универсальная сущность продажи. Проходит через стадии воронки. Заменяет лиды, заявки, продажи. |
| Воронка (Pipeline) | Настраиваемая последовательность стадий для сделок. |
| Продажа (Order) | Процесс исполнения/оформления. Создаётся из сделки. Форма и этапы определяются типом продажи. |
| Тип продажи (Order Type) | Шаблон процесса оформления: кастомные поля, этапы, документы, финальные действия. Привязывается к продукту. |
| Контакт (Contact) | Физическое лицо в базе CRM. Создаётся явно, не автоматически. Может быть связан с несколькими компаниями (many-to-many). |
| Компания (Company) | Юридическое лицо / организация клиента. Может быть связана с несколькими контактами (many-to-many). |
| Drawer | Глобальная боковая панель для быстрого создания CRM-сущностей. Один drawer без вложенности, с выпадающими списками для связанных сущностей. |
| Лицензия | Единица тарификации в организации. Одна лицензия = одно место для сотрудника. |
| Шаблон проекта (Project Template) | Преднастроенная конфигурация: набор модулей, воронка, типы продаж. |
3. Типы аккаунтов и жизненный цикл¶
3.1 Способы появления аккаунта¶
Путь 1: Самостоятельная регистрация
→ Полноценный аккаунт физлица
→ Может создавать личные проекты
→ Может создать организацию
→ Может быть приглашён в чужую организацию (сохраняя личные проекты)
→ Флаг «Создание личных проектов» = ДА
Путь 2: Приглашение в организацию
→ Аккаунт привязан к организации
→ Работает только внутри проектов организации (по умолчанию)
→ Флаг «Создание личных проектов» = НЕТ
→ Администратор организации может изменить этот флаг
3.2 Флаг «Создание личных проектов»¶
Управляет только возможностью создания новых личных проектов. Существующие личные проекты остаются доступными независимо от значения флага.
| Сценарий | Значение | Кто управляет |
|---|---|---|
| Самостоятельная регистрация | ДА | Всегда ДА, нельзя отключить себе |
| Приглашение (новый пользователь) | НЕТ | Администратор организации |
| Приглашение (существующий пользователь) | ДА (сохраняется) | Администратор может отключить |
| Сотрудник удалён из организации | ДА (автоматически) | Система |
При отключении флага: - Существующие личные проекты продолжают работать. - Кнопка «Создать проект» в личном пространстве исчезает.
3.3 Конвертация аккаунта¶
| Направление | Что с проектами |
|---|---|
| Физлицо → Юрлицо | Личные проекты остаются. Новые создаются в пространстве организации. Данные из личных проектов можно импортировать. |
| Юрлицо → Физлицо | Недоступно. Организация может быть только деактивирована. |
3.4 Удаление сотрудника из организации¶
Сотрудник удалён:
├── Теряет доступ ко ВСЕМ проектам организации
├── Записи сотрудника переназначаются ПО КАЖДОМУ ПРОЕКТУ ОТДЕЛЬНО:
│ ├── Руководитель отдела ЕСТЬ в этом проекте?
│ │ ├── Да → записи переназначаются ему
│ │ └── Нет → записи получают статус «Требует переназначения»
│ │ ├── Project Admin получает уведомление
│ │ ├── Записи видны Project Admin и Project Owner
│ │ ├── В списках сделок/продаж — фильтр «Без владельца»
│ │ └── Переназначение через bulk action или вручную
│ └── Записи НИКОГДА не передаются за пределы проекта (изоляция)
├── Данные организации недоступны
├── Аккаунт переходит в режим «Физическое лицо»
├── Флаг «Создание личных проектов» → ДА
├── Лицензия освобождается
└── Может войти в систему, создать свои проекты, быть приглашён в другую организацию
4. Авторизация и аутентификация¶
4.1 Маршруты¶
| URL | Экран |
|---|---|
/ |
Landing (редирект в /home при активной сессии) |
/auth/signin |
Sign In |
/auth/signup |
Sign Up |
/auth/signup/organization |
Org Setup (шаг 2) |
/auth/forgot-password |
Forgot Password |
/auth/reset-password/:token |
Reset Password |
/auth/verify-email/:token |
Verify Email |
/auth/2fa |
Two-Factor Auth |
/auth/invite/:token |
Accept Invitation |
4.2 Процесс входа¶
1. Email + пароль
2. Если 2FA → /auth/2fa
3. Определение контекста (организации, проекты, пространства)
4. Редирект:
├── Есть проекты → последний активный → /home
├── Нет проектов, флаг = ДА → онбординг / создание проекта
└── Нет проектов, флаг = НЕТ → заглушка «Вы не добавлены ни в один проект»
4.3 Регистрация¶
Физлицо:
/auth/signup → имя, email, пароль → подтверждение email
→ /onboarding/profile → /onboarding/first-project → /home
Юрлицо:
/auth/signup → имя, email, пароль → подтверждение email
→ /auth/signup/organization (реквизиты)
→ /onboarding/profile → /onboarding/first-project → /onboarding/invite-team → /home
По приглашению (новый):
/auth/invite/:token → регистрация (имя, пароль; email предзаполнен)
→ /onboarding/profile (краткий)
→ Авто-добавление в организацию + проекты → /home
Флаг = НЕТ (по умолчанию)
По приглашению (существующий):
/auth/invite/:token → вход → подтверждение → добавление в организацию
Личные проекты сохраняются. Флаг = ДА.
4.4 Онбординг¶
| URL | Когда |
|---|---|
/onboarding/profile |
После любой регистрации |
/onboarding/first-project |
После самостоятельной регистрации |
/onboarding/invite-team |
При создании организации |
4.5 Заглушка «Нет проектов»¶
Пользователь приглашён в организацию, но не назначен ни в один проект (флаг = НЕТ): - Показывается экран: «Вы ещё не добавлены ни в один проект. Обратитесь к администратору.» - Доступны: Профиль, Безопасность. - Недоступны: Портфель, Проекты (пустой список).
5. Модель пространств и владения проектами¶
5.1 Два типа пространств¶
Личное пространство Пространство организации
──────────────────── ─────────────────────────
Владелец = физлицо Владелец = организация
Проекты создаёт владелец Проекты создают PO / PA
В проект — ЛЮБОЙ пользователь В проект — ТОЛЬКО сотрудники
Лимит участников по тарифу Лимит сотрудников по лицензии
Данные между проектами НЕ передаются Данные МОЖНО передавать
Биллинг = личная подписка Биллинг = лицензия организации
Биллинг личного и корпоративного пространства полностью независим. Проблемы с личной подпиской никак не влияют на работу в проектах организации и наоборот.
5.2 Селектор проекта (шапка)¶
▼ Выбор проекта
┌──────────────────────────────────────────┐
│ Личные проекты [+ ◊] │ ← [+] если флаг = ДА
│ ◉ Фриланс │
│ ○ Консалтинг │
├──────────────────────────────────────────┤
│ Альфа Групп [+ ◊] │ ← [+] если PO/PA
│ ○ Продажи CIS │
│ ○ Маркетинг EU │
├──────────────────────────────────────────┤
│ Бета ООО │ ← нет [+]
│ ○ Партнёрка │
└──────────────────────────────────────────┘
5.3 Обмен данными между проектами организации¶
Правила:
• Только между проектами ОДНОЙ организации
• Личные проекты НЕ участвуют
• Инициировать может Manager и выше
• После передачи объекты живут независимо
• Изменения в целевом проекте НЕ синхронизируются с исходным
5.4 Матрица передачи: что копируется, что нет¶
| Сущность | Копируется? | Почему |
|---|---|---|
| Сделка | ✅ | Основная сущность передачи |
| Лёгкие контактные поля | ✅ | Часть сделки (имя, телефон, email, название компании) |
| Источник сделки | ✅ | Текстовое поле, часть сделки |
| Lineage-данные | ✅ | origin_project_id, origin_entity_id, snapshot_version, кто/когда |
| Контакт | ❌ | Привязка в целевом проекте вручную |
| Компания | ❌ | Привязка в целевом проекте вручную |
| Продажи | ❌ | Привязаны к Order Type проекта-источника, которого может не быть в целевом |
| Продукты | ❌ | Каталог продуктов per-project |
| Активности | ❌ | Задачи/звонки/встречи остаются в исходном проекте |
| Документы | ❌ | Привязаны к продажим и проекту-источнику |
5.5 Поведение переданной сделки в целевом проекте¶
Сделка приходит в целевой проект "чистой":
├── С лёгкими контактными данными (имя, телефон, email)
├── С lineage-ссылкой на исходный проект
├── Без продаж, продуктов, активностей, документов
├── Попадает на ПЕРВУЮ СТАДИЮ воронки целевого проекта
├── Помечена меткой «Передана из проекта "X"»
└── В исходном проекте: статус «Передан» + ссылка на целевой
Подсказка контактов:
├── Система ищет совпадения по лёгким полям (email, телефон, имя)
│ среди контактов/компаний целевого проекта
├── Если найдено → «Привязать к существующему контакту Иванов И.И.?»
├── Если не найдено → менеджер создаёт нового (с проверкой дублей)
└── Далее менеджер добавляет продукты из каталога целевого проекта
Менеджер работает с переданной сделкой как с обычной:
привязывает контакт → добавляет продукты → двигает по воронке → создаёт продажаы
Эволюционный путь: - v1: копия сделки + lineage-ссылка, подсказка контактов по лёгким полям. Дедупликация только внутри проекта. - v2+: opt-in «Org Master Data» — глобальный каталог контактов с кросс-проектной дедупликацией (на базе identity_hash).
6. Проектно-центричная архитектура¶
6.1 Модульная архитектура¶
ЯДРО (всегда включено):
├── Дашборд
├── Статистика
└── Настройки проекта / Участники / Роли / Политики доступа
БАЗОВЫЕ МОДУЛИ (включаются/выключаются per-project):
├── 👥 Контакты
├── 🏢 Клиенты (компании)
├── 💰 Сделки (воронки, канбан)
├── 🛒 Продажи (типы продаж, этапы, канбан)
├── 📋 Активности (задачи, звонки, встречи, календарь)
├── 📦 Продукты (каталог, прайсы, привязка к типам продаж)
├── 📊 Отчёты (аналитика, конструктор)
├── 📄 Документы (документы, шаблоны с подстановкой)
└── ⚡ Автоматизация (триггеры, правила, действия)
Если модуль отключён — скрывается не только пункт меню, но и все связанные поля и настройки в других разделах (Contextual UI). Отключение НЕ удаляет данные — при включении обратно всё доступно.
6.2 Шаблоны проектов¶
При создании проекта — выбор из списка базовых шаблонов:
Создание проекта:
Шаг 1 → Выберите шаблон из списка
Шаг 2 → Название, описание
Шаг 3 → Подтверждение модулей (можно изменить)
Шаг 4 → Приглашение участников
Базовые шаблоны v1 (5 штук, захардкожены):
| Шаблон | Модули | Воронка |
|---|---|---|
| Продажи B2B | Контакты, Клиенты, Сделки, Продукты, Продажи, Активности, Документы, Отчёты | Обращение → Квалификация → КП → Переговоры → Согласование → Оформление |
| Колл-центр | Контакты, Сделки, Активности, Отчёты | Входящий → Обработка → Квалификация → Передан в продажи |
| Автосалон | Контакты, Клиенты, Сделки, Продукты, Продажи, Активности, Документы, Отчёты | Обращение → Показ → Тест-драйв → КП → Trade-in → Сделка → Выдача |
| Доставка | Контакты, Сделки, Продукты, Продажи, Отчёты | Заявка → Подтверждение → Готовится → В пути → Доставлен |
| По умолчанию | Контакты, Клиенты, Сделки, Активности, Отчёты | Новая → В работе → Завершена |
Шаблон предзаполняет модули и воронку. Всё можно изменить после создания. В будущих версиях — возможность пользователю сохранить свой проект как шаблон.
6.3 Жизненный цикл проекта¶
Создание → Настройка → Работа → Архивация (read-only) → Удаление
Архивация проекта: - Все данные переходят в read-only (включая незавершённые продажаы). - Webhook'и и автоматизации останавливаются. - Статусы сущностей фиксируются «как есть». - Разархивация возможна (Project Owner).
7. Сделки и воронки (Deal-centric продажи)¶
7.1 Сделка — универсальная сущность продажи¶
Лиды, заявки, продажи — НЕ отдельные сущности. Это сделка на разных стадиях воронки.
7.2 На кого создаётся сделка¶
Сделка может быть создана: - На компанию — основной сценарий B2B. Контактное лицо подтягивается. - На контакт (физлицо) — если клиент = физическое лицо без компании.
Связь Контакт ↔ Компания = many-to-many: один контакт может работать в нескольких компаниях, одна компания может иметь несколько контактов.
7.3 Встроенные контактные данные (лёгкие поля)¶
Сделка содержит встроенные поля для быстрого ввода: - Имя контакта, телефон, email, название компании (текстом). - Это НЕ запись в базе контактов. Просто поля сделки.
Полноценный контакт/компания в базе создаётся явно: - Вручную: менеджер нажимает «Создать контакт/компанию из сделки». - Автоматически: при переходе на стадию воронки (настраивается).
7.4 Проверка дублей при квалификации¶
При создании контакта/компании из сделки система проверяет: - Контакт: email, телефон (нормализованный). - Компания: ИНН, домен email, название. - Лиды (сделки): проверка на дубли по контактным данным.
Результат проверки:
├── Совпадений нет → создаётся новая запись
├── Найдено совпадение → «Похожий контакт/компания уже существует. Привязать?»
│ ├── Да → сделка привязывается к существующему
│ └── Нет, это другой → создаётся новая запись
└── При повторном обращении: система авто-привязывает сделку к существующему контакту
В истории контакта добавляется запись о привязке новой сделки (событие + время + кто + данные).
7.5 Снимок контактных данных (Drift Detection)¶
При привязке контакта или компании к сделке система создаёт снимок ключевых полей на связи. Если данные контакта/компании позже изменятся — в карточке сделки отображается предупреждение.
Три слоя контактных данных:
Слой 1: Лёгкие поля сделки (текст)
«Иванов, +79205434343, ivan@mail.com»
Заполняются при создании сделки. НЕ меняются.
Не связаны с записью в базе контактов.
Нужны для быстрого ввода до квалификации.
Слой 2: Ссылка на контакт/компанию (живая)
deal.contact_id → Contact #42
Всегда показывает АКТУАЛЬНЫЕ данные.
Появляется после квалификации / ручной привязки.
Слой 3: Снимок на связи (drift detection)
deal_contact_link.snapshot = { name, phone, email, linked_at }
Хранится на связи между сделкой и контактом.
Сравнивается с текущим состоянием Contact #42.
Если есть расхождение → предупреждение в UI.
Поведение в UI:
Вариант А (данные не изменились):
Иванов Иван Иванович
+7 920 543-43-43
ivan@mail.com
Вариант Б (данные изменились после привязки):
Иванов Иван Иванович
+7 916 123-45-67 ⚠ изменён
ivan@mail.com
⚠ Данные контакта изменены после привязки к сделке
Телефон: +79205434343 → +79161234567 (Петрова, 15 янв)
[Принять изменения] [Открыть контакт]
«Принять изменения» — обновляет снимок до текущих данных. Предупреждение исчезает. В аудите — запись «подтверждение изменений контакта».
Приоритеты: - Продажа → Контакт/Компания: Must Have (данные критичны для документов и webhook) - Сделка → Контакт/Компания: Should Have
Подробнее: раздел 9.6.
7.6 Воронка (Pipeline)¶
Воронка — настраиваемая последовательность стадий для сделок.
Настройки воронки:
├── Стадии (название, порядок, цвет)
├── Ответственные по стадиям (отдел / роль)
├── Источники сделок (настраиваемый справочник)
│ ├── Яндекс.Директ, Google Ads, Сайт, Телефония
│ ├── Email-рассылка, Рекомендация, Холодный обзвон
│ └── + Добавить свой
└── Авто-создание контакта (на какой стадии, или «не создавать»)
Воронка для сделок, этапы для продаж — это разные механики:
Воронка сделки = ПРОДАЖА (дожим)
Канбан-доска: drag & drop по стадиям
Результат: клиент согласен → создаётся продажа(ы)
Этапы продажи = ИСПОЛНЕНИЕ (оформление)
Настраиваются внутри Order Type (шаблона продажи)
Канбан-доска тоже доступна (включается в настройках модуля Продажи)
Результат: продукт оформлен/выдан/подключён
7.7 Тайминги стадий и лог переходов¶
Система ведёт полный лог входов на каждую стадию. Каждый переход (включая возврат назад) — новая запись.
Хранение:
deal_stage_entered_at — когда сделка перешла на ТЕКУЩУЮ стадию (последний вход)
stage_log — полный лог всех переходов:
[
{ stage: "КП", entered_at: Jan 10, exited_at: Jan 15 },
{ stage: "Согласование", entered_at: Jan 15, exited_at: Jan 20 },
{ stage: "КП", entered_at: Jan 20, exited_at: null } ← возврат
]
Для продаж — аналогично: order_stage_entered_at + stage_log.
Поведение при возврате на предыдущую стадию:
├── Создаётся НОВАЯ запись в stage_log (не стирает историю)
├── deal_stage_entered_at обновляется на текущий момент
└── Таймер стадии считается с последнего входа
Использование в v1:
├── «Текущий срок на стадии» = с последнего входа (deal_stage_entered_at)
├── «Суммарное время на стадии КП» = сумма всех периодов на КП
├── «Количество возвратов» = сколько раз сделка возвращалась назад
├── Отчёт «Зависшие сделки» (> N дней без движения)
└── Фильтр «На стадии более X дней» в списках и канбане
Использование в v2+:
├── SLA per-стадия (настраиваемые лимиты времени)
├── Автоматические предупреждения при приближении к лимиту
├── Эскалация при превышении SLA
└── SLA-индикаторы в канбане (светофор: зелёный/жёлтый/красный)
8. Продажи и типы продаж (Order-centric исполнение)¶
8.1 Продажа создаётся из сделки¶
Когда сделка доходит до стадии «клиент согласен» — менеджер создаёт продажа(ы). Тип продажи определяется продуктом.
8.2 Тип продажи (Order Type)¶
Тип продажи — конфигурируемый шаблон процесса оформления:
Тип продажи содержит:
├── Название
├── Кастомные поля (конструктор форм)
│ ├── Тип: текст / число / дата / выбор / файл / чекбокс
│ ├── Обязательность
│ ├── Значение по умолчанию
│ └── Валидация
├── Этапы оформления (статусная модель)
│ ├── Название этапа
│ ├── Условия перехода
│ └── Действия при переходе
├── Шаблоны документов (с переменными для подстановки)
├── Финальное действие (webhook / email / задача / ничего)
│ └── Обработка ошибок — индивидуально для каждого шаблона (см. 8.7)
└── Версия схемы (schema_version)
8.3 Связь: Продукт → Тип продажи → Продажа¶
Продукт «ЗП Премиум»
└── Тип продажи = «Зарплатный проект»
Сделка «Банк Ромашка» (стадия: согласовано)
└── «Создать продажу» → система видит продукт → подставляет тип продажи
→ динамическая форма с полями этого типа
8.4 Одна сделка — несколько продаж¶
Сделка «Банк Ромашка — комплекс услуг»
├── Продажа #1: Зарплатный проект (тип: ЗП) → свои поля, этапы, webhook
└── Продажа #2: РКО (тип: РКО) → свои поля, этапы, webhook
Каждый продажа независим: свой статус, свой ответственный.
8.5 Канбан для продаж¶
Продажи тоже можно просматривать как канбан-доску по этапам (аналогично сделкам по стадиям воронки). Включается в настройках модуля Продажи.
/p/:pid/orders → список продаж (по умолчанию)
/p/:pid/orders/kanban → канбан по этапам (опционально)
8.6 Версионирование типов продаж¶
Типы продаж версионируются для обратной совместимости:
OrderType хранит schema_version.
Каждый Order хранит order_type_version (на момент создания).
Новые обязательные поля применяются только к новым продажим.
Для старых — поле nullable или со значением по умолчанию.
Детальная стратегия версионирования будет проработана отдельно
с учётом всех сценариев работы с версиями шаблонов.
8.7 Снимок контактных данных для продаж (Drift Detection)¶
Для продаж drift detection критически важен: данные контакта и компании подставляются в шаблоны документов и финальные действия (webhook). Если реквизиты изменились после создания продажи — это может привести к ошибкам в документах.
Поведение для продаж:
├── При создании продажи: снимок контакта и компании фиксируется
├── При изменении данных контакта/компании:
│ ├── В карточке продажи: ⚠ «Реквизиты компании изменены»
│ ├── При генерации документа: предупреждение перед генерацией
│ │ «Реквизиты компании изменились с момента создания продажи.
│ │ Проверьте данные перед генерацией документа.»
│ └── При финальном действии (webhook): предупреждение
└── Действие: «Принять изменения» → снимок обновляется
Подробнее: раздел 9.6.
8.8 Отказоустойчивость финальных действий (DLQ)¶
Финальные действия продаж (webhook, email) могут завершиться ошибкой (внешняя система недоступна, таймаут, 5xx, невалидные данные).
Механизм Dead-Letter Queue (DLQ):
├── При ошибке финального действия:
│ ├── Retry policy (настраивается per Order Type)
│ │ ├── Количество повторов
│ │ ├── Интервал (экспоненциальная задержка)
│ │ └── Максимальное время ожидания
│ ├── После исчерпания попыток → статус «Ошибка отправки»
│ │ ├── Продажа помечен на канбане (визуально выделен)
│ │ ├── Уведомление ответственному менеджеру
│ │ └── Кнопка «Повторить отправку» (Manager+)
│ └── Логирование: каждая попытка, код ответа, тело ошибки
│
├── Редактирование в статусе «Ошибка отправки»:
│ ├── Менеджер МОЖЕТ редактировать поля продажи
│ │ (ошибка может быть из-за невалидных данных — опечатка в ИНН и т.п.)
│ ├── После исправления → «Повторить отправку»
│ └── В аудите: изменение полей + повторная отправка
│
├── Продажа НЕ блокируется полностью — можно работать с любыми полями
└── В аудите: все попытки отправки с результатами
9. Контакты и компании¶
9.1 Many-to-many¶
Контакт ↔ Компания = many-to-many
Иванов работает в «Альфа» и «Бета»
В «Альфа» работают Иванов, Петрова, Сидоров
9.2 Identity Hash (подготовка к Org Master Data)¶
При создании контакта/компании система автоматически генерирует скрытый хеш для будущей кросс-проектной идентификации:
Contact.identity_hash = hash(normalize(email) + normalize(phone))
Company.identity_hash = hash(normalize(ИНН) + normalize(domain))
В v1: хеш хранится, но не используется в UI.
В v2+: при разработке Org Master Data хеш позволит мгновенно
связать записи одного клиента из разных проектов в единый профиль.
9.3 Создание через Drawer¶
Принцип: минимум полей при создании, обогащение позже.
Drawer = скорость. Карточка = полнота. Не смешиваем.
Создание сделки через Drawer (6-8 полей максимум):
├── Обязательные: Название, Воронка, Стадия
├── Лёгкие контактные: Имя, Телефон, Email (текстовые поля сделки)
├── Компания: dropdown «Выбрать» / «Новая» → только Название
├── Продукт: dropdown
└── Всё.
ИНН, реквизиты, адрес, доп. контакты — это ОБОГАЩЕНИЕ.
Менеджер заходит в карточку компании позже и дозаполняет.
Progressive Disclosure (аккордеон):
Если при создании менеджер выбирает «Новая компания» —
форма плавно раздвигается вниз, показывая только Название.
Остальные поля (адрес, реквизиты) — позже в карточке.
Один drawer без вложенности. Для связанных сущностей — выпадающие списки (выбор существующей компании/контакта). Если нужно создать новое — дополнительные поля прямо в drawer (Progressive Disclosure).
9.4 Merge дублей¶
Механизм слияния дублей контактов и компаний:
Дедуп-ключи:
Контакт: email, телефон (нормализованный)
Компания: ИНН, домен email, название
Merge-процесс:
1. Система предлагает кандидатов на слияние
2. Менеджер выбирает master-запись
3. Preview: что куда переедет (сделки, продажаы, активности, документы)
4. Подтверждение → merge
5. Shadow-копия хранится 30 дней (откат доступен Admin+)
6. Аудит: кто, когда, какие записи, что изменилось
Минимальная роль для merge: Manager
Откат merge: Admin+
9.6 Снимок данных при привязке (Drift Detection)¶
Контакты и компании — «записная книжка» проекта. Они переиспользуются в сделках, продажих и других сущностях. При привязке контакта/компании к сущности система делает снимок ключевых полей. Если данные позже изменятся — система подсвечивает расхождение.
Что фиксируется в снимке:
Контакт: name, phone, email
Компания: name, ИНН, phone
Где применяется:
├── Сделка → Контакт (Should Have)
├── Сделка → Компания (Should Have)
├── Продажа → Контакт (Must Have — данные в документах/webhook)
└── Продажа → Компания (Must Have — реквизиты в документах/webhook)
Поведение:
├── Данные не изменились → обычное отображение
├── Данные изменились →
│ ├── Индикатор ⚠ рядом с изменённым полем
│ ├── Подробности: «Телефон: +79205434343 → +79161234567 (Петрова, 15 янв)»
│ └── Действие: «Принять изменения» → снимок обновляется, ⚠ исчезает
└── В аудите: запись о подтверждении изменений
Особые случаи:
├── Множественные изменения:
│ Сравнивается текущее состояние с моментом привязки (не промежуточные)
├── Merge контактов:
│ Снимок остаётся от исходного → расхождение подсветится
├── Продажи + документы:
│ Предупреждение перед генерацией документа если есть drift
└── Передача сделки:
В целевом проекте при новой привязке — создаётся новый снимок
9.7 Коллизия Soft Delete и уникальных ключей¶
Сценарий А: Создание при наличии удалённого дубля
Контакт ivan@mail.com удалён (soft delete, в корзине 7 дней).
Кто-то создаёт нового с тем же email.
Поведение:
├── Система проверяет И живые И удалённые записи
├── Найден удалённый → «Контакт с таким email в корзине. Восстановить?»
│ ├── Да → восстановление из корзины
│ └── Нет, создать новый → старая запись hard-delete, новый создаётся
└── На уровне БД: partial unique index (WHERE deleted_at IS NULL)
Сценарий Б: Восстановление при наличии живого дубля
Контакт ivan@mail.com удалён. Создан новый ivan@mail.com (живой).
Админ пытается восстановить старого из корзины.
Поведение:
├── Система проверяет: ключ занят живой записью?
│ ├── Да → «Контакт с таким email уже существует. Объединить записи?»
│ │ ├── Да → стандартный Merge (восстанавливаемый + живой)
│ │ └── Нет → восстановить с очищенным email (ручная правка)
│ └── Нет → обычное восстановление
└── Система никогда не падает с ошибкой уникального индекса
10. Модуль «Продукты»¶
10.1 Продукт = шаблон бизнес-процесса¶
Продукт — не просто строчка в прайсе. Тип продукта определяет какой продажа будет создан.
Продукт:
├── Название, описание, категория
├── Ценообразование (прайс, тарифы, скидки)
├── Тип продажи → ссылка на Order Type
│ ├── «Стандартный продажа» (позиции + сумма)
│ ├── «Зарплатный проект» (кастомные поля)
│ └── null (продукт без продажи)
└── Предзаполнение полей продажи
└── Например: Тариф = «Премиум»
11. Источники сделок (вместо модуля «Маркетинг»)¶
Модуль «Маркетинг» убран в v5. Заменён справочником источников в настройках воронки.
Каждая сделка при создании:
├── Воронка: [выбор]
├── Источник: [выбор из справочника]
└── ...остальные поля
В отчётах:
└── Отчёт по источникам: кол-во сделок, конверсия, выручка
Будущее (v2+): полноценный модуль «Маркетинг» — кампании с бюджетами, email-рассылки, UTM-трекинг, ROI. Подробнее в Приложении А.
11a. Модуль «Активности»¶
11a.1 Типы активностей¶
Задача (Task): название, описание, срок, приоритет, статус, ответственный
Звонок (Call): тема, направление (вх/исх), дата/время, длительность, результат
Встреча (Meeting): тема, дата начала/окончания, место/ссылка, участники, результат
Заметка (Note): текст, дата, автор
11a.2 Привязка к сущностям¶
Активность может быть привязана к одной или нескольким сущностям (сделка, продажа, контакт, компания). Активность без привязки — личная задача менеджера. В карточке каждой сущности — вкладка «Активности».
11a.3 Создание¶
- Через Drawer — быстрое создание (название, тип, срок, ответственный, привязка).
- Из карточки сущности — кнопка «+ Активность» с предзаполненной привязкой.
- Из календаря — клик на дату/время с предзаполненной датой.
11a.4 Напоминания¶
Настройка при создании задачи/встречи:
○ Без напоминания
◉ За 15 минут
○ За 1 час
○ За 1 день
○ В момент срока
Напоминание → уведомление in-app + email (по настройкам пользователя).
11a.5 Просроченные активности¶
Задача с истёкшим сроком:
├── Визуальное выделение в списке (красный цвет / метка «Просрочена»)
├── Счётчик просроченных в боковом меню: «Активности (3)»
├── На дашборде: виджет «Просроченные задачи»
└── Фильтр «Просроченные» в списке активностей
11a.6 Календарь¶
/p/:pid/activities/calendar
Представления: День / Неделя (по умолчанию) / Месяц
Что отображается: задачи (по сроку), звонки, встречи (по времени)
Фильтры: тип активности, мой/все, привязанная сущность
v1: только свой календарь.
v2+: командный календарь, синхронизация с Google Calendar / Outlook.
11b. Модуль «Отчёты» (детализация)¶
11b.1 Встроенные отчёты (v1)¶
1. По продажам: сделки (новые/Won/Lost), суммы, средний чек, конверсия, динамика
2. По воронке: конверсия между стадиями, среднее время на стадии, зависшие сделки
3. По клиентам: новые контакты/компании, топ-10 по сумме, контакты без сделок
4. По активности: активности по типам и менеджерам, просроченные, время до первой активности
5. По источникам: сделки по источникам, конверсия, выручка, средний чек
11b.2 Общие принципы¶
Каждый отчёт:
├── Таблица (всегда есть)
├── Диаграмма (bar / line / pie / funnel — по типу)
├── Переключатель таблица ↔ диаграмма
├── Фильтры: период, менеджер, воронка, источник
└── Селектор периода: сегодня / неделя / месяц / квартал / произвольный
Contextual UI: нет модуля «Активности» → отчёт по активности скрыт.
Данные: абсолютные значения из аудит-лога + текущее состояние.
11b.3 Конструктор отчётов (Could Have)¶
Выбор сущности → метрики → группировка → фильтры → визуализация → сохранение.
11c. Модуль «Документы» (детализация)¶
11c.1 Шаблоны документов¶
Шаблон содержит:
├── Название
├── Контекст привязки (Продажа / Сделка / Контакт / Компания)
├── Формат: DOCX (файл-шаблон с переменными)
└── Привязка к типу продажи (опционально)
11c.2 Доступные переменные¶
Контакт: {{contact.name}}, {{contact.phone}}, {{contact.email}}, {{contact.position}}
Компания: {{company.name}}, {{company.inn}}, {{company.address}}, {{company.phone}}
Сделка: {{deal.name}}, {{deal.amount}}, {{deal.source}}, {{deal.created_at}}, {{deal.owner.name}}
Продажа: {{order.number}}, {{order.created_at}}, {{order.type.name}}, {{order.owner.name}}
{{order.field.<key>}} — значения кастомных полей Order Type
Проект: {{project.name}}
Даты: {{today}}, {{today.year}}
11c.3 Генерация документа¶
1. Менеджер открывает карточку продажи/сделки → «Сгенерировать документ» → выбор шаблона
2. Система подставляет переменные из связанных сущностей
3. Drift Detection: предупреждение если данные контакта/компании изменились
4. Результат (DOCX) → сохраняется в разделе «Документы»
5. Скачивание, перегенерация (новая версия, старая сохраняется)
Автоматическая генерация: может быть настроена как действие при переходе на этап продажи.
11c.4 Версионирование¶
При перегенерации — новая версия, предыдущие доступны в списке версий. В аудите — событие «перегенерация» с указанием изменений.
12. Ролевая модель¶
12.1 Два уровня ролей¶
Системные роли (глобальные):
• Platform Owner — владелец организации
• Platform Admin — администратор организации
• Regular User — физлицо без организации
• Employee — сотрудник организации
Проектные роли (per-project):
• Project Owner — владелец проекта
• Project Admin — полный доступ
• Manager — управление данными, воронками, отчётами
• Member — работа с назначенными/доступными сущностями
• Viewer — только просмотр
12.2 Матрица: Системные роли¶
| Действие | Platform Owner | Platform Admin | Regular User | Employee |
|---|---|---|---|---|
| Управление организацией | ✅ | ✅ | — | ❌ |
| Биллинг организации | ✅ | ✅ | — | ❌ |
| Сотрудники и лицензии | ✅ | ✅ | — | ❌ |
| Подразделения | ✅ | ✅ | — | ❌ |
| Создание проектов организации | ✅ | ✅ | — | ❌ |
| Создание личных проектов | ✅ | ✅ | ✅ | По флагу |
| Флаг сотрудников | ✅ | ✅ | — | ❌ |
| Профиль и безопасность | ✅ | ✅ | ✅ | ✅ |
| Личная подписка | ✅ | ✅ | ✅ | По флагу |
| Удаление организации | ✅ | ❌ | — | ❌ |
12.3 Матрица: Проектные роли¶
| Действие | Owner | Admin | Manager | Member | Viewer |
|---|---|---|---|---|---|
| Настройки проекта, модули, политики | ✅ | ✅ | ❌ | ❌ | ❌ |
| Участники и роли | ✅ | ✅ | ❌ | ❌ | ❌ |
| Воронки и стадии | ✅ | ✅ | ✅ | ❌ | ❌ |
| Типы продаж (конструктор) | ✅ | ✅ | ✅ | ❌ | ❌ |
| Источники сделок | ✅ | ✅ | ✅ | ❌ | ❌ |
| Автоматизация | ✅ | ✅ | ✅ | ❌ | ❌ |
| Создание контактов/компаний | ✅ | ✅ | ✅ | ✅ | ❌ |
| Редактирование контактов/компаний | ✅ | ✅ | ✅ | ✅* | ❌ |
| Создание сделок | ✅ | ✅ | ✅ | ✅ | ❌ |
| Перемещение по воронке (канбан) | ✅ | ✅ | ✅ | ✅* | ❌ |
| Создание продаж (из сделки) | ✅ | ✅ | ✅ | ✅ | ❌ |
| Создание активностей | ✅ | ✅ | ✅ | ✅ | ❌ |
| Продукты и прайсы | ✅ | ✅ | ✅ | ❌ | ❌ |
| Отчёты: просмотр | ✅ | ✅ | ✅ | ✅ | ✅ |
| Отчёты: конструктор | ✅ | ✅ | ✅ | ❌ | ❌ |
| Документы: просмотр | ✅ | ✅ | ✅ | ✅ | ✅ |
| Документы: шаблоны | ✅ | ✅ | ✅ | ❌ | ❌ |
| Merge контактов/компаний | ✅ | ✅ | ✅ | ❌ | ❌ |
| Передача данных в другой проект | ✅ | ✅ | ✅ | ❌ | ❌ |
| Шаринг записей | ✅ | ✅ | ✅ | ✅ | ❌ |
| Массовые операции | ✅ | ✅ | ✅ | ❌ | ❌ |
| Удаление данных | ✅ | ✅ | ❌ | ❌ | ❌ |
| Архивация/удаление проекта | ✅ | ❌ | ❌ | ❌ | ❌ |
* Member — доступ определяется политикой (свои, отдела, расшаренные).
13. Политики доступа к записям¶
13.1 Три механизма¶
1. Роль (RBAC): Manager видит все, Member — по политике.
2. Иерархия: руководитель видит записи подчинённых (вверх по дереву отделов).
3. Шаринг: владелец может расшарить запись конкретному коллеге (view или edit).
13.2 Владение записями¶
Каждая сущность всегда привязана к владельцу: - Конкретный человек — менеджер, создавший или назначенный. - Отдел — если конкретный ответственный не назначен или уволен. Записями отдела управляет руководитель отдела (или выше по иерархии).
Записи никогда не остаются без владельца.
13.3 Шаринг доступа к отделу¶
Пользователю из другого отдела можно дать доступ ко всем записям отдела — виртуальное членство без переноса сотрудника в штат отдела: - Сотрудник видит записи отдела согласно своей проектной роли. - Не меняет иерархию подчинения.
13.4 Настройки политик per-project¶
Настройки проекта → Политики доступа
Видимость записей для роли «Member»:
○ Только свои записи
◉ Свои + расшаренные ← по умолчанию
○ Свои + записи подчинённых
○ Свои + записи своего отдела
○ Все записи проекта
Видимость для «Manager»:
◉ Все записи проекта ← по умолчанию
Шаринг:
☑ Разрешить шаринг записей
☑ Уведомлять при шаринге
14. Иерархическая структура подразделений¶
14.1 Дерево отделов¶
Организация «Альфа Групп»
├── Дирекция
│ ├── Генеральный директор (Platform Owner)
│ └── Финансовый директор (Platform Admin)
├── Департамент продаж
│ ├── Руководитель продаж
│ ├── Отдел B2B
│ │ ├── Руководитель B2B
│ │ └── Менеджеры...
│ └── Отдел B2C
│ ├── Руководитель B2C
│ └── Менеджеры...
└── Поддержка
├── Руководитель
└── Операторы...
14.2 Свойства подразделения¶
├── Название
├── Родительское подразделение (иерархия)
├── Руководитель
├── Сотрудники
├── Привязка к проектам (роль по умолчанию)
└── Шаринг доступа (внешние сотрудники с виртуальным доступом к записям отдела)
14.3 Два способа управления доступами¶
Через отделы (массовый):
Создать отдел → привязать к проекту с ролью по умолчанию
→ Добавление сотрудника в отдел = авто-добавление в связанные проекты
Через проект (ручной):
Открыть проект → добавить сотрудника → назначить роль
→ Работает независимо от отделов
15. Аудит и история¶
15.1 Единый журнал событий, два представления¶
Все действия хранятся в одной системе событий. Просмотр — через фильтры:
Событие (Event):
├── Тип: create / read / update / delete / transfer / status_change / login / logout / merge / share
├── Timestamp
├── Кто (user_id, user_name)
├── Сущность (entity_type, entity_id)
├── Проект (project_id)
├── Изменения (JSON Patch, RFC 6902 — только дельта, не полные old/new)
└── Метаданные (IP, user_agent — для login/logout)
15.2 Хранение изменений: гибридный подход¶
Изменения хранятся в двух форматах одновременно — для UI и для аналитики:
Формат 1: JSON Patch (RFC 6902) — для UI
Компактная дельта изменений. Используется для визуального diff в интерфейсе.
Пример: менеджер изменил стадию сделки и сумму
Patch:
[
{ "op": "replace", "path": "/stage", "from": "КП", "value": "Переговоры" },
{ "op": "replace", "path": "/amount", "from": 500000, "value": 750000 }
]
В UI аудита: визуальный diff (как в Git)
stage: КП → Переговоры
amount: 500 000 → 750 000
Формат 2: Абсолютные значения ключевых полей — для аналитики
Для бизнес-критичных полей дополнительно сохраняется абсолютное значение.
Позволяет SQL-запросы: «все сделки, где сумма была > 1 млн в январе».
Ключевые поля (фиксируются per-entity):
Сделка: stage, amount, owner_id, source
Продажа: status, order_type_id, owner_id
Контакт: email, phone
Компания: inn, name
Аналитика строится по абсолютным значениям (быстрые SQL-запросы). Детальный diff в UI — по JSON Patch.
Что логируется: - CRUD-операции на всех сущностях - Передача данных между проектами - Изменения статусов (сделки, продажаы) - Шаринг записей - Входы и выходы из системы - Merge контактов/компаний - Изменения ролей и прав - Доступ к данным (чтение)
15.3 Два представления¶
Per-entity (история сущности): В карточке каждой сделки/контакта/продажи — вкладка «История»: - Все события связанные с этой записью - Кто, когда, что изменил - Привязка новых сделок к контакту
Per-user (журнал пользователя): - Руководитель видит действия своих подчинённых (по иерархии отделов) - Сотрудник видит только свои действия - Platform Owner / Admin видит всё в организации - Project Admin видит все действия в проекте
15.4 Маршруты аудита¶
| URL | Экран | Доступ |
|---|---|---|
/p/:pid/audit |
Project Audit Log | Project Admin |
/account/organization/audit |
Organization Audit Log | Platform Owner, Admin |
16. Биллинг и лицензирование¶
16.1 Тарифы физлица¶
| Параметр | Free | Pro | Business |
|---|---|---|---|
| Проекты | 3 | 10 | ∞ |
| Участников в проекте | 5 | 15 | ∞ |
| Хранилище | 1 GB | 10 GB | 100 GB |
| Автоматизации (на проект) | 5 | 50 | ∞ |
| Конструктор отчётов | ❌ | ✅ | ✅ |
| Типы продаж | 1 | 10 | ∞ |
16.2 Лицензии организации¶
| Параметр | Starter | Pro | Enterprise |
|---|---|---|---|
| Сотрудники | 10 | 50 | ∞ |
| Проекты | 5 | 25 | ∞ |
| Хранилище | 5 GB | 50 GB | 500 GB |
| Автоматизации (на проект) | 10 | 100 | ∞ |
| Типы продаж (на проект) | 5 | 50 | ∞ |
| Передача данных между проектами | ✅ | ✅ | ✅ |
| Кастомные роли | ❌ | ✅ | ✅ |
| SSO / SAML | ❌ | ❌ | ✅ |
| Self-hosted | ❌ | ❌ | ✅ |
16.3 Перелимит и грейс-период¶
Перелимит (тариф понижен / лимит исчерпан):
├── Все существующие данные переходят в READ-ONLY
├── Создание новых сущностей заблокировано
├── Приглашение новых участников заблокировано
├── Редактирование существующих записей заблокировано
├── Баннер: «Ваш тариф не покрывает текущие проекты. Обновите план.»
└── Данные НЕ удаляются и НЕ архивируются автоматически
Неоплата:
├── Грейс-период: 7 дней
├── В течение грейс-периода: полная функциональность
├── После грейс-периода: read-only режим
└── Данные хранятся (не удаляются)
Биллинг личного и корпоративного пространства полностью независим. Перелимит личной подписки не влияет на работу в проектах организации.
16.4 Кто видит раздел оплаты¶
| Тип | Что видит |
|---|---|
| Физлицо (без орг.) | Свою подписку |
| Platform Owner / Admin | Подписку организации |
| Employee | Раздел скрыт |
| Физлицо + сотрудник | Свою личную подписку |
17. Удаление данных и retention¶
17.1 Трёхступенчатая модель¶
Soft Delete → Архив → Hard Delete
Soft Delete (корзина):
├── Период: 7 дней
├── Запись помечена как deleted, не отображается в списках
├── Можно восстановить (Admin+)
└── Связанные данные сохраняют ссылки
Архив:
├── Период: 6 месяцев после soft delete
├── Данные в read-only
├── Занимают место в хранилище
├── Доступны для аудита и lineage
└── Восстановление — по запросу (Admin)
Hard Delete:
├── Через 1 год после архивации
├── Физическое удаление из горячих таблиц
├── Аудит-записи сохраняются (без данных сущности)
└── Необратимо
17.2 Merge и shadow-копии¶
При merge контактов/компаний: - Shadow-копия поглощённой записи хранится 30 дней. - Откат merge доступен Admin+. - После 30 дней shadow-копия удаляется, merge необратим.
18. Массовые операции и импорт¶
18.1 Массовые операции (Bulk Actions)¶
Доступны для Manager и выше:
Выделить N записей → действие:
├── Перенести на стадию (сделки)
├── Назначить ответственного
├── Передать в другой проект (организация)
├── Расшарить
├── Удалить (soft delete)
├── Экспорт выборки
└── Изменить поле (массовое редактирование)
18.2 Импорт данных¶
Импорт из CSV/Excel:
Импортируемые сущности:
├── Контакты
├── Компании
└── Продукты
Процесс:
1. Загрузка файла (CSV / Excel)
2. Маппинг колонок → поля системы
3. Preview: первые N строк
4. Проверка дублей (по дедуп-ключам)
5. Импорт с отчётом: создано / обновлено / пропущено (дубли) / ошибки
6. Аудит: кто, когда, сколько записей
Минимальная роль: Manager
18.3 Экспорт данных¶
Экспорт отчётов и выборок — будет проработан отдельно (v2+).
19. Просмотр профиля других пользователей¶
| Кто смотрит | Что видит |
|---|---|
| Platform Owner / Admin | Полный профиль: данные, отдел, проекты, роли, лицензия, флаг |
| Project Admin | В контексте проекта: имя, email, роль, активность |
| Manager / Member | Базовый: имя, аватар, отдел, должность, роль в текущем проекте |
| Viewer | Минимальный: имя, аватар |
19a. Уведомления¶
19a.1 Каналы¶
v1:
├── In-app (колокольчик 🔔 в шапке) — основной канал
│ ├── Счётчик непрочитанных (badge)
│ ├── Dropdown: список уведомлений, прочитано/непрочитано
│ ├── «Отметить все как прочитанные»
│ └── Real-time обновление (WebSocket / SSE)
└── Email — для критичных событий и когда пользователь офлайн
19a.2 События-триггеры¶
| Категория | Событие | Кому | Канал |
|---|---|---|---|
| Сделки | Новая сделка назначена | Ответственный | In-app |
| Сделки | Сделка переведена на другую стадию | Ответственный | In-app |
| Сделки | Сделка передана в другой проект | Ответственный в целевом | In-app + Email |
| Продажи | Ошибка финального действия (DLQ) | Ответственный | In-app + Email |
| Продажи | Все попытки retry исчерпаны | Ответственный + PA | In-app + Email |
| Данные | Drift Detection: данные контакта/компании изменены | Ответственный | In-app |
| Данные | Запись расшарена пользователю | Получатель | In-app |
| Данные | Записи требуют переназначения | Project Admin | In-app + Email |
| Активности | Напоминание об активности | Ответственный | In-app + Email |
| Активности | Активность просрочена | Ответственный | In-app |
| Организация | Приглашение в проект/организацию | Приглашённый | |
| Организация | Проект архивирован | Все участники | In-app + Email |
| Биллинг | Перелимит тарифа | PO / PA | In-app + Email |
| Биллинг | Грейс-период истекает (за 2 дня) | PO / PA | In-app + Email |
| Импорт | Импорт завершён | Инициатор | In-app |
19a.3 Настройки per-user¶
Per-канал для каждой категории. Критичные уведомления НЕ отключаются:
• DLQ ошибки, перелимит, приглашения, переназначение записей.
Email-уведомления:
◉ Сразу ○ Дайджест раз в час ○ Дайджест раз в день ○ Выключены
19b. Дашборд и Статистика¶
19b.1 Дашборд (/p/:pid/dashboard)¶
Первый экран при входе в проект. Фиксированный набор виджетов (v1):
Верхняя строка — ключевые метрики:
Сделки в работе (кол-во + сумма) | Новые за период | Won за период | Продажи в работе
Средний блок:
Воронка (конверсия по стадиям) | Сделки по источникам
Нижний блок:
Просроченные задачи (макс. 5) | Ближайшие активности (макс. 5) | Последние действия (макс. 10)
Адаптивность по ролям: Member — только свои метрики, Manager+ — всего проекта. Адаптивность по модулям (Contextual UI): виджеты скрываются при отключении модуля. Селектор периода: сегодня / неделя / месяц (по умолчанию) / квартал / произвольный.
19b.2 Статистика (/p/:pid/statistics)¶
Более глубокая аналитика: продажи (динамика, средний чек), воронка (конверсия, среднее время на стадии), источники (конверсия, выручка), команда (активности по менеджерам), продажаы (по типам, среднее время).
19c. Поиск и фильтрация¶
19c.1 Глобальный поиск¶
Строка поиска в шапке. Контекст = текущий проект.
Поиск по: сделки, контакты, компании, продажаы, активности, продукты.
Начинается после ≥ 2 символов. По подстроке, регистронезависимый.
Результаты группируются по типу (макс. 5 на тип).
19c.2 Фильтрация в списках¶
Каждый список имеет панель фильтров: - Сделки: стадия, воронка, ответственный, источник, дата, сумма, «на стадии > N дней», «без владельца». - Контакты: компания, дата создания, создатель, «есть сделки». - Продажи: тип, этап, ответственный, DLQ-ошибка, дата. - Активности: тип, статус, просроченные, ответственный, срок.
19c.3 Сортировка и пагинация¶
Все списки: сортировка по клику на заголовок (▲ / ▼ / сброс). Пагинация: 25 / 50 / 100 записей. Канбан: infinite scroll, 20 карточек на колонку.
Фильтры сохраняются в URL (query params), сбрасываются при уходе. Сохранённые views — v2+.
19d. Настройки пользователя¶
/account/profile → секция «Настройки»
Язык: Русский (по умолчанию) / English. v2+: доп. языки.
Часовой пояс: авто из браузера, переопределяемый. Хранение в БД — UTC.
Формат даты: ДД.ММ.ГГГГ / ММ/ДД/ГГГГ / ГГГГ-ММ-ДД
Формат времени: 24ч (по умолчанию) / 12ч
Разделитель тысяч: пробел / запятая
Валюта: ₽ (RUB). v2+: мультивалютность per-project.
Вид по умолчанию:
Сделки: Канбан ◉ / Список ○
Продажи: Канбан ○ / Список ◉
Активности: Список ◉ / Календарь ○
Последний использованный вид запоминается.
Тема: v1 — светлая. v2+ — тёмная.
19e. Жизненный цикл связанных сущностей¶
19e.1 Закрытие сделки как «Проигрыш»¶
Есть незавершённые продажаы → предупреждение:
├── Отменить продажаы → статус «Отменён»
├── Оставить как есть → продажаы продолжают жить
└── Не закрывать сделку (отмена)
Активности остаются.
19e.2 Переоткрытие сделки¶
Закрытая сделка (Won/Lost) может быть переоткрыта Manager+. На любую активную стадию. В stage_log — новая запись. В аудите — событие + причина.
19e.3 Удаление стадии / воронки / типа продажи¶
Стадия с активными сделками:
НЕ удаляется. «Переместите сделки на другую стадию.»
Быстрое действие: «Переместить все на [стадия]».
Воронка:
Единственная → удаление запрещено.
С сделками → перенос в другую воронку (первая стадия).
Тип продажи:
С активными продажими → удаление запрещено.
Без активных → soft delete. Продукты теряют привязку (предупреждение).
19e.4 Удаление продукта¶
С активными сделками → предупреждение. Сделки сохранят название как текст.
Продажи не затрагиваются (хранят order_type_version).
19e.5 Отключение модуля с данными¶
Предупреждение: «Есть N незавершённых записей. Они станут недоступны.»
Данные НЕ удаляются. Webhook и DLQ retry приостанавливаются.
При включении обратно — всё доступно. Приостановленные webhook НЕ возобновляются автоматически.
19e.6 Удаление контакта/компании с привязками¶
Soft delete: привязки сохраняются, контакт помечен «Удалён».
Лёгкие поля сделки НЕ затрагиваются. При восстановлении — привязки восстанавливаются.
При hard delete — привязки обнуляются, лёгкие поля остаются.
20. Полная карта экранов и URL¶
20.1 Авторизация и онбординг (12 экранов)¶
| URL | Экран |
|---|---|
/ |
Landing |
/auth/signin |
Sign In |
/auth/signup |
Sign Up |
/auth/signup/organization |
Org Setup |
/auth/forgot-password |
Forgot Password |
/auth/reset-password/:token |
Reset Password |
/auth/verify-email/:token |
Verify Email |
/auth/2fa |
2FA |
/auth/invite/:token |
Accept Invitation |
/onboarding/profile |
Profile Setup |
/onboarding/first-project |
First Project |
/onboarding/invite-team |
Invite Team |
20.2 Глобальные (3 экрана)¶
| URL | Экран | Доступ |
|---|---|---|
/home |
Dashboard | Все |
/projects |
Projects List | Все |
/projects/new |
Create Project | По правам |
20.3 Аккаунт (22 экрана)¶
| URL | Экран | Доступ |
|---|---|---|
/account/profile |
My Profile | Все |
/account/security |
Security | Все |
/account/security/sessions |
Active Sessions | Все |
/account/organization |
Org Profile | PO, PA (edit) / Employee (read) |
/account/organization/convert |
Convert to Org | Физлицо без орг. |
/account/organization/departments |
Departments (tree) | PO, PA |
/account/organization/departments/new |
Create Department | PO, PA |
/account/organization/departments/:id/edit |
Edit Department | PO, PA |
/account/organization/employees |
Employees List | PO, PA |
/account/organization/employees/new |
Add Employee | PO, PA |
/account/organization/employees/:id |
Employee Profile | PO, PA (full) / коллеги (базовый) |
/account/organization/employees/:id/edit |
Edit Employee | PO, PA |
/account/organization/employees/invitations |
Invitations | PO, PA |
/account/organization/audit |
Org Audit Log | PO, PA |
/account/billing |
Billing Overview | Физлицо / PO, PA |
/account/billing/plans |
Plans | Физлицо / PO, PA |
/account/billing/payments |
Payment History | Физлицо / PO, PA |
/account/billing/invoices |
Invoices | Физлицо / PO, PA |
/account/billing/payment-methods |
Payment Methods | Физлицо / PO, PA |
20.4 Управление проектом (7 экранов)¶
| URL | Экран | Мин. роль |
|---|---|---|
/p/:pid/settings |
Project Settings | Project Admin |
/p/:pid/settings/modules |
Modules (on/off) | Project Admin |
/p/:pid/settings/policies |
Access Policies | Project Admin |
/p/:pid/members |
Project Members | Project Admin |
/p/:pid/members/invite |
Invite Member | Project Admin |
/p/:pid/roles |
Project Roles | Project Admin |
/p/:pid/audit |
Project Audit Log | Project Admin |
20.5 Портфель — CRM-экраны (модули)¶
Ядро (2 экрана)¶
| URL | Экран | Мин. роль |
|---|---|---|
/p/:pid/dashboard |
Dashboard | Viewer |
/p/:pid/statistics |
Statistics | Viewer |
Контакты — модуль (3 экрана)¶
| URL | Экран | Мин. роль | Примечание |
|---|---|---|---|
/p/:pid/contacts |
Contacts List | Member | Создание через drawer |
/p/:pid/contacts/:id |
Contact Details | Member | Many-to-many с компаниями, история |
/p/:pid/contacts/:id/edit |
Edit Contact | Member* |
Клиенты / Компании — модуль (3 экрана)¶
| URL | Экран | Мин. роль | Примечание |
|---|---|---|---|
/p/:pid/companies |
Companies List | Member | Создание через drawer |
/p/:pid/companies/:id |
Company Details | Member | Many-to-many с контактами, история |
/p/:pid/companies/:id/edit |
Edit Company | Member* |
Сделки — модуль (6 экранов)¶
| URL | Экран | Мин. роль | Примечание |
|---|---|---|---|
/p/:pid/deals |
Deals List | Member | Создание через drawer |
/p/:pid/deals/kanban |
Deals Kanban | Member | Drag & drop по стадиям воронки |
/p/:pid/deals/:id |
Deal Details | Member | Контактные поля, привязки, продажаы, история |
/p/:pid/deals/pipelines |
Pipelines List | Manager | |
/p/:pid/deals/pipelines/new |
Create Pipeline | Manager | Стадии, источники, авто-создание контакта |
/p/:pid/deals/pipelines/:id/edit |
Edit Pipeline | Manager |
Продажи — модуль (7 экранов)¶
| URL | Экран | Мин. роль | Примечание |
|---|---|---|---|
/p/:pid/orders |
Orders List | Member | Фильтр по типу, статусу |
/p/:pid/orders/kanban |
Orders Kanban | Member | По этапам (включается в настройках) |
/p/:pid/orders/:id |
Order Details | Member | Форма из Order Type, этапы, документы, история |
/p/:pid/orders/:id/edit |
Edit Order | Member* | |
/p/:pid/orders/types |
Order Types | Manager | |
/p/:pid/orders/types/new |
Create Order Type | Manager | Конструктор: поля, этапы, документы, действия |
/p/:pid/orders/types/:id/edit |
Edit Order Type | Manager |
Активности — модуль (4 экрана)¶
| URL | Экран | Мин. роль |
|---|---|---|
/p/:pid/activities |
Activities List | Member |
/p/:pid/activities/calendar |
Calendar View | Member |
/p/:pid/activities/:id |
Activity Details | Member |
/p/:pid/activities/:id/edit |
Edit Activity | Member* |
Продукты — модуль (4 экрана)¶
| URL | Экран | Мин. роль |
|---|---|---|
/p/:pid/products |
Products Catalog | Viewer |
/p/:pid/products/:id |
Product Details | Viewer |
/p/:pid/products/:id/edit |
Edit Product | Manager |
/p/:pid/products/pricing |
Pricing | Manager |
Отчёты — модуль (2 экрана)¶
| URL | Экран | Мин. роль |
|---|---|---|
/p/:pid/reports |
Reports Summary | Viewer |
/p/:pid/reports/builder |
Report Builder | Manager |
Встроенные типы: по продажам, по воронке, по клиентам, по активности, по источникам сделок.
Документы — модуль (5 экранов)¶
| URL | Экран | Мин. роль |
|---|---|---|
/p/:pid/documents |
Documents List | Viewer |
/p/:pid/documents/:id |
Document Details | Viewer |
/p/:pid/documents/templates |
Templates Library | Manager |
/p/:pid/documents/templates/new |
Create Template | Manager |
/p/:pid/documents/templates/:id/edit |
Edit Template | Manager |
Автоматизация — модуль (3 экрана)¶
| URL | Экран | Мин. роль |
|---|---|---|
/p/:pid/automation |
Automation Rules | Manager |
/p/:pid/automation/new |
Create Rule | Manager |
/p/:pid/automation/:id/edit |
Edit Rule | Manager |
* Member — доступ определяется политикой (свои, отдела, расшаренные).
21. Паттерн создания сущностей¶
21.1 Drawer — один, без вложенности¶
Глобальная боковая панель для быстрого создания. Один drawer, без стека/вложенности.
Принцип: минимум полей при создании, обогащение позже. Drawer = скорость. Карточка = полнота.
Создание через Drawer: Контакт, Компания, Сделка, Продажа (из сделки), Активность, Продукт.
Количество полей: 6-8 максимум. Подробный состав полей для каждой сущности описан в разделе 9.3 (на примере сделки).
Связанные сущности — Progressive Disclosure (аккордеон): - При создании сделки: выбор компании/контакта из dropdown. - Если «Новая компания» — форма плавно раздвигается вниз, показывая только Название. - ИНН, реквизиты, адрес — заполняются позже в карточке компании (обогащение). - Аналогично для контакта при создании компании.
Поведение: - При переключении проекта — drawer закрывается (предупреждение о несохранённых данных). - Drawer привязан к текущему проекту.
21.2 На отдельных страницах¶
Сложные сущности: Воронка, Тип продажи, Шаблон документа, Правило автоматизации, Отчёт (конструктор).
22. Полная структура системы (дерево)¶
Fairflow
│
├── Аккаунт
│ ├── Профиль
│ │ ├── Персональные данные
│ │ └── Настройки (язык, часовой пояс, уведомления)
│ ├── Организация (адаптивно по роли)
│ │ ├── ○ Нет → «Создать организацию»
│ │ ├── ● Владелец / Админ:
│ │ │ ├── Реквизиты
│ │ │ ├── Подразделения (иерархия)
│ │ │ │ ├── Дерево отделов
│ │ │ │ ├── Создание / редактирование
│ │ │ │ ├── Руководитель
│ │ │ │ ├── Привязка к проектам (роль по умолчанию)
│ │ │ │ └── Шаринг доступа (виртуальное членство)
│ │ │ ├── Сотрудники и лицензии
│ │ │ │ ├── Список (X / Y лицензий)
│ │ │ │ ├── Добавление / приглашение
│ │ │ │ ├── Карточка (данные, отдел, проекты, флаг)
│ │ │ │ ├── Редактирование
│ │ │ │ └── Приглашения (ожидающие)
│ │ │ └── Журнал аудита (организация)
│ │ └── ● Сотрудник → информация (чтение)
│ ├── Оплата (адаптивно)
│ │ ├── Физлицо → личная подписка
│ │ ├── PO/PA → лицензия организации
│ │ └── Сотрудник → скрыт
│ │ Содержимое:
│ │ ├── Текущий план и лимиты
│ │ ├── Тарифные / лицензионные планы
│ │ ├── История платежей
│ │ ├── Счета
│ │ └── Способы оплаты
│ └── Безопасность
│ ├── Активные сессии
│ ├── 2FA
│ └── Смена пароля
│
├── Проекты
│ ├── ▼ Селектор (шапка)
│ │ ├── Личные [+ если флаг = ДА]
│ │ ├── Организация А [+ если PO/PA]
│ │ └── Организация Б [без +]
│ ├── Список проектов
│ ├── Создание проекта
│ │ ├── Шаблон (B2B / Колл-центр / Автосалон / Доставка / По умолчанию)
│ │ ├── Название, описание
│ │ ├── Подтверждение модулей
│ │ └── Приглашение участников
│ ├── Настройки проекта
│ │ ├── Общие
│ │ ├── Модули (вкл/выкл)
│ │ └── Политики доступа
│ ├── Участники / Приглашения
│ ├── Роли проекта
│ └── Журнал аудита (проект)
│
└── Портфель (контекст проекта, модули)
│
├── Дашборд (ядро)
├── Статистика (ядро)
│
├── 👥 Контакты (модуль)
│ ├── Список (создание через drawer)
│ ├── Карточка (many-to-many с компаниями, история)
│ └── Редактирование
│
├── 🏢 Клиенты (компании) (модуль)
│ ├── Список (создание через drawer)
│ ├── Карточка (many-to-many с контактами, история)
│ └── Редактирование
│
├── 💰 Сделки (модуль)
│ ├── Список (создание через drawer)
│ ├── Канбан (воронка, drag & drop)
│ ├── Карточка
│ │ ├── Встроенные контактные поля (лёгкие)
│ │ ├── Привязка к контакту / компании
│ │ ├── Привязанные продукты
│ │ ├── Привязанные продажаы
│ │ ├── Источник сделки
│ │ ├── Шаринг
│ │ └── История (события)
│ └── Воронки
│ ├── Список
│ ├── Создание (стадии, источники, авто-контакт)
│ └── Редактирование
│
├── 🛒 Продажи (модуль)
│ ├── Типы продаж (конструктор)
│ │ ├── Список типов
│ │ ├── Создание (поля, этапы, документы, действия)
│ │ └── Редактирование
│ ├── Список продаж
│ ├── Канбан (по этапам, опционально)
│ ├── Карточка (форма из типа, этапы, документы, история)
│ └── Редактирование
│
├── 📋 Активности (модуль)
│ ├── Список (создание через drawer)
│ ├── Календарь
│ ├── Карточка
│ └── Редактирование
│
├── 📦 Продукты (модуль)
│ ├── Каталог (создание через drawer)
│ ├── Карточка (+ привязка к типу продажи)
│ ├── Редактирование
│ └── Прайсы
│
├── 📊 Отчёты (модуль)
│ ├── Сводка
│ └── Конструктор (?type=sales|funnel|clients|activity|sources)
│
├── 📄 Документы (модуль)
│ ├── Список
│ ├── Просмотр
│ └── Шаблоны (библиотека, создание, редактирование)
│
└── ⚡ Автоматизация (модуль)
├── Список правил
├── Создание
└── Редактирование
23. Сводка по экранам¶
| Категория | Кол-во |
|---|---|
| Авторизация и онбординг | 12 |
| Глобальные (Home, Projects) | 3 |
| Аккаунт: Профиль, Безопасность | 5 |
| Аккаунт: Организация, подразделения, сотрудники, аудит | 10 |
| Аккаунт: Оплата | 5 |
| Управление проектом (settings, modules, policies, members, roles, audit) | 7 |
| Портфель: Ядро | 2 |
| Портфель: Контакты | 3 |
| Портфель: Клиенты | 3 |
| Портфель: Сделки и воронки | 6 |
| Портфель: Продажи и типы | 7 |
| Портфель: Активности | 4 |
| Портфель: Продукты | 4 |
| Портфель: Отчёты | 2 |
| Портфель: Документы | 5 |
| Портфель: Автоматизация | 3 |
| Итого | ~81 экран |
24. Бизнес-процессы (ключевые сценарии)¶
24.1 Полный цикл продажи (банк)¶
1. Обращение → сделка в воронке «Продажи»
Источник: Сайт. Лёгкие поля: имя, телефон, email, «хочу ЗП проект».
2. Квалификация → проверка дублей
├── Телефон совпал с существующим контактом → «Привязать к Иванову И.И.?»
├── Да → сделка привязана к контакту, в истории контакта — событие
└── Нет совпадений → «Создать контакт» (авто на стадии или вручную)
3. КП → Согласование → Клиент согласен
4. «Создать продажу» → продукт «ЗП Премиум» → тип продажи «Зарплатный проект»
Динамическая форма: кол-во карт, тариф, дата начала...
5. Продажа проходит этапы:
Заполнение → Проверка → Подписание → Отправка
6. Финальное действие → webhook в АБС
7. Продажа = «Завершён». Сделка = «Закрыта (Won)».
24.2 Несколько продуктов в сделке¶
Сделка «Банк Ромашка — комплекс»
├── Продажа #1: ЗП проект (тип: ЗП) → свои поля, этапы, webhook
└── Продажа #2: РКО (тип: РКО) → свои поля, этапы, webhook
Независимые. Разные ответственные.
Сделка закрывается когда все продажаы завершены (или вручную).
24.3 Передача между проектами¶
1. Проект «Входящие» → сделка квалифицирована → B2B
2. «Передать в "Продажи B2B"»
3. Копируется ТОЛЬКО сделка:
✅ Лёгкие контактные поля (имя, телефон, email)
✅ Источник сделки
✅ Lineage-ссылка (origin_project, snapshot)
❌ Продажи, продукты, активности, документы
❌ Контакт / компания (как записи в базе)
4. В исходном: статус «Передан» + ссылка
5. В целевом: сделка на первой стадии воронки + метка «Передана из "Входящие"»
6. Система подсказывает: «Найден контакт Иванов И.И. (ivan@mail.com). Привязать?»
7. Менеджер привязывает контакт → добавляет продукты → работает как с обычной сделкой
24.4 Иерархический доступ и шаринг¶
Иванов (менеджер) создал сделку:
✅ Иванов — владелец
✅ Козлов — руководитель (иерархия)
✅ Сидоров — руководитель Козлова (вверх)
❌ Петрова — коллега (не видит)
Иванов расшарил Петровой → ✅ видит.
24.5 Увольнение сотрудника¶
1. PA удаляет Иванова
2. Система проверяет ПО КАЖДОМУ ПРОЕКТУ:
Проект «Продажи B2B»: руководитель Козлов есть в проекте?
✅ Да → 30 сделок Иванова → Козлову
Проект «Холодные звонки»: руководитель Козлов есть в проекте?
❌ Нет → 20 сделок → статус «Требует переназначения»
→ Project Admin получает уведомление
→ Фильтр «Без владельца» в списке сделок
3. Лицензия освобождается
4. Иванов → режим физлица, может использовать платформу
24.6 Массовые операции¶
Manager выделяет 30 сделок на стадии «Холодная база»:
→ «Назначить ответственного: Петрова»
→ Все 30 переназначены, в истории каждой — событие
24.7 Импорт при миграции¶
1. Компания переходит с другой CRM
2. Экспортирует контакты и компании в CSV
3. Manager загружает CSV → /p/:pid/contacts (импорт)
4. Маппинг колонок → поля системы
5. Проверка дублей → «5 совпадений, обновить существующие?»
6. Импорт: создано 450, обновлено 5, ошибок 3
7. Аудит: событие «импорт 458 записей»
25. Self-hosted / Локальное развёртывание¶
25.1 Что заложить в архитектуру (v1)¶
├── Контейнеризация (Docker)
├── Абстракция хранилища (S3-интерфейс)
├── Абстракция email (SMTP-интерфейс)
├── Конфигурация через environment variables
├── Экспорт данных организации
└── API-first архитектура
25.2 Реализация (v2+)¶
├── Docker Compose для self-hosted
├── Helm chart для Kubernetes
├── Документация по развёртыванию
├── Лицензионный сервер
├── MinIO для локального S3
└── Admin-панель on-premise
26. Расширения (v2+)¶
Полный roadmap v2+ вынесен в Приложение А в конце документа. Краткий перечень направлений:
- Платформа: Self-hosted, мобильное приложение, live-редактирование
- Данные: Org Master Data, кросс-проектная дедупликация, кросс-проектные отчёты, lineage-граф
- Роли: Кастомные роли, кастомные поля, SSO/SAML
- Модули: Маркетинг (кампании, рассылки, ROI), отраслевые (Автосалон, Общепит, Недвижимость)
- Сделки/Продажи: Мультивалютность, SLA per-стадия, Split-View канбан, fuzzy merge
- UX/AI: Drawer-Assistant, пользовательские шаблоны проектов
- Интеграции: Email, телефония, мессенджеры, API, обогащение по ИНН
- Экспорт: Данные проекта, отчёты
27. Классификация требований (MoSCoW)¶
Must Have (v1)¶
- Изоляция данных на уровне проектов
- Ролевая модель (системные + проектные роли)
- Модульная архитектура per-project
- Базовые политики видимости (RBAC + иерархия)
- Order Types (динамические типы продаж)
- Воронки (настраиваемые стадии для сделок)
- Drawer (глобальное быстрое создание, Progressive Disclosure, 6-8 полей)
- Шаблоны проектов (5 базовых)
- Проверка дублей при квалификации (+ проверка корзины при создании И при восстановлении)
- Единый журнал аудита (гибрид: JSON Patch + абсолютные значения ключевых полей)
- Импорт данных (CSV/Excel)
- Contextual UI (скрытие всего что связано с отключённым модулем)
- Soft delete + архив + hard delete (retention)
- Перелимит → read-only + грейс-период
- Заглушка «нет проектов» для сотрудников без назначений
- DLQ для финальных действий продаж (retry + статус ошибки + редактирование полей)
- Stage log: полный лог входов на стадии (включая возвраты, для отчётов по срокам)
- identity_hash для контактов/компаний (заложить в модель, не в UI)
- Переназначение записей при увольнении (per-project проверка + «Требует переназначения»)
- Матрица передачи сделок (что копируется, что нет) + подсказка контактов в целевом проекте
- Drift Detection для продаж: снимок контакта/компании при привязке, предупреждение при изменении данных
- Уведомления: in-app (колокольчик) + email для критичных событий
- Глобальный поиск по проекту (по сделкам, контактам, компаниям, продажим)
- Фильтрация и сортировка в списках (сделки, контакты, продажаы, активности)
- Пагинация (25/50/100 записей на странице)
- Дашборд: фиксированный набор виджетов (метрики, воронка, просроченные задачи)
- Статистика: отчёты по продажам, воронке, источникам, команде, продажим
- Активности: задачи, звонки, встречи, заметки — типы, привязка к сущностям, напоминания
- Календарь активностей (свой, день/неделя/месяц)
- Просроченные активности: визуальное выделение, счётчик в меню
- Жизненный цикл: запрет удаления стадий/воронок/типов продаж с активными данными
- Настройки пользователя: язык, часовой пояс, формат даты, вид по умолчанию
Should Have (v1)¶
- Иерархическая видимость (начальник → подчинённые)
- Передача данных между проектами (копия сделки + lineage, без контактов/продаж/продуктов)
- Генерация документов по шаблонам (DOCX с переменными)
- Шаблоны документов: переменные контакта, компании, продажи, сделки
- Версионирование документов (при перегенерации)
- Merge контактов/компаний (с откатом)
- Шаринг записей и доступа к отделу
- Массовые операции (bulk actions)
- Канбан для продаж
- Drift Detection для сделок: снимок контакта/компании при привязке, предупреждение при изменении данных
- Встроенные отчёты: по продажам, по воронке, по клиентам, по активности, по источникам
- Переоткрытие закрытых сделок (Manager+)
- Настройки уведомлений per-user (выбор категорий, частота email)
Could Have (v1)¶
- Конструктор отчётов
- Автоматизация (триггеры/правила)
- Сохранённые фильтры (views)
- Настраиваемый дашборд (drag & drop виджетов)
Won't Have (v1)¶
- Полноценный модуль «Маркетинг»
- Self-hosted развёртывание
- Мобильное приложение
- Кастомные роли
- AI-парсинг (Drawer-Assistant)
- Cross-Project Lineage (граф)
- Live-редактирование
- Экспорт данных (будет проработан отдельно)
- Circuit Breaker для webhook (паттерн «предохранитель»)
- SLA-индикаторы в канбане (светофор)
- Повторяющиеся активности
- Командный календарь, синхронизация с Google Calendar / Outlook
- Тёмная тема
- Push-уведомления
28. Принятые архитектурные решения (changelog)¶
| # | Решение | Обоснование |
|---|---|---|
| 1 | Проект — единица изоляции данных | Масштабирование через проекты |
| 2 | Модульная архитектура per-project | Разные проекты = разные инструменты |
| 3 | Contextual UI: отключённый модуль = скрыты все связанные элементы | Минимальная когнитивная нагрузка |
| 4 | 5 базовых шаблонов проектов (захардкожены) | Быстрый старт, пользовательские шаблоны — v2+ |
| 5 | Лиды, заявки, продажи = стадии воронки, не отдельные сущности | Deal-centric подход |
| 6 | Контакты создаются явно, не автоматически | Чистая база без мусора |
| 7 | Контакт ↔ Компания = many-to-many | Один человек может работать в нескольких компаниях |
| 8 | Сделка может быть на компанию или на контакт (физлицо) | Поддержка B2B и B2C |
| 9 | Воронка для сделок, этапы для продаж — разные механики | Продажа и исполнение разделены |
| 10 | Канбан доступен и для сделок (воронка) и для продаж (этапы) | Единый UX-паттерн |
| 11 | Продукт определяет тип продажи | Разные продукты = разные процессы оформления |
| 12 | Одна сделка → несколько продаж | Каждый продажа независим |
| 13 | Маркетинг убран в v1, заменён источниками сделок | Справочник + отчёт = 90% потребностей |
| 14 | Двухуровневые роли (системные + проектные) | Платформа vs проект |
| 15 | RBAC + иерархия отделов + шаринг | Гибкая видимость |
| 16 | Каждая запись ВСЕГДА привязана к владельцу (человек или отдел) | Нет «сиротских» записей |
| 17 | Шаринг доступа к отделу = виртуальное членство | Без переноса сотрудника |
| 18 | Флаг «Создание личных проектов» = только создание новых | Существующие проекты не затрагиваются |
| 19 | Биллинг личного и корпоративного пространства независим | Флаг управляет правами, не деньгами |
| 20 | Перелимит = read-only (grandfathering) | Данные не теряются |
| 21 | Грейс-период при неоплате: 7 дней | Мягкий подход |
| 22 | Удалённый сотрудник → проверка по каждому проекту отдельно | Руководителю если он в проекте, иначе «Требует переназначения» + уведомление Admin. Изоляция проектов не нарушается |
| 23 | Удалённый сотрудник → аккаунт = физлицо | Не блокирует человека |
| 24 | Передача между проектами = копируется ТОЛЬКО сделка | Продажи, продукты, активности, контакты, компании НЕ копируются. Полная матрица в 5.4 |
| 25 | Drawer — один, без вложенности, 6-8 полей max | Progressive Disclosure (аккордеон). Обогащение — в карточке |
| 26 | Проверка дублей при квалификации | По email, телефону, ИНН. Проверка и живых и удалённых записей |
| 27 | Merge с shadow-копией 30 дней, откат Admin+ | Защита от ошибок |
| 28 | Единый журнал аудита, два представления (per-entity, per-user) | Одна система, два фильтра |
| 29 | Аудит: CRUD + статусы + входы + merge + шаринг + передачи | Полная прозрачность |
| 30 | Аудит: иерархическая видимость (руководитель → подчинённые) | Согласованность с политиками доступа |
| 31 | Аудит: гибридное хранение (JSON Patch + абсолютные значения ключевых полей) | Patch для UI-diff, абсолютные значения для SQL-аналитики |
| 32 | Soft delete 7 дней → архив 6 мес → hard delete 1 год | Трёхступенчатый retention |
| 33 | Soft delete + unique index: проверка при создании И при восстановлении | Создание: предложить восстановить. Восстановление: если ключ занят → предложить Merge |
| 34 | Архивация проекта = read-only всех данных (включая продажаы) | Статусы фиксируются «как есть» |
| 35 | Массовые операции для Manager+ | Bulk actions без ада кликов |
| 36 | Импорт CSV/Excel (контакты, компании, продукты) | Миграция с других CRM |
| 37 | Конкурентное редактирование: last write + история (v1), live-editing v2+ | Минимальная сложность для v1 |
| 38 | Версионирование Order Type (schema_version) | Обратная совместимость |
| 39 | DLQ для финальных действий (retry + статус ошибки + редактирование полей) | Менеджер может исправить данные и повторить отправку |
| 40 | identity_hash для контактов и компаний (заложить в модель) | Нулевая стоимость сейчас, фундамент для Org Master Data v2+ |
| 41 | Stage log: полный лог входов на каждую стадию (включая возвраты) | Каждый вход = новая запись. Возврат не стирает историю. Фундамент для SLA v2+ |
| 42 | Переданная сделка → первая стадия воронки + метка + подсказка контактов | Система ищет совпадения по лёгким полям в целевом проекте |
| 43 | Self-hosted: заложить в архитектуру (Docker, абстракции), реализовать v2+ | Скорость разработки v1 |
| 44 | Drift Detection: снимок контакта/компании при привязке к сделке/продажау | Менеджер видит что данные изменились после привязки. Для продаж — Must Have (документы, webhook), для сделок — Should Have |
| 45 | Уведомления: in-app (колокольчик) + email, real-time через WebSocket/SSE | Критичные события (DLQ, перелимит, приглашения) не отключаются. Остальные настраиваются per-user |
| 46 | Активности: 4 типа (задача, звонок, встреча, заметка), привязка к любой сущности | Покрывает 90% потребностей менеджера. Повторяющиеся активности — v2+ |
| 47 | Дашборд: фиксированный набор виджетов, адаптивный по ролям и модулям | Настраиваемый дашборд — v2+. Contextual UI: виджеты скрываются при отключении модуля |
| 48 | Глобальный поиск по проекту (по подстроке, ≥ 2 символов) | Результаты группируются по типу сущности, макс. 5 на тип |
| 49 | Фильтры в URL (query params), сбрасываются при уходе. Сохранённые views — v2+ | Минимальная сложность для v1, фильтры шарятся через копирование URL |
| 50 | Запрет удаления стадий/воронок/типов продаж с активными данными | Сначала перемещение, потом удаление. Защита от потери данных |
| 51 | Документы: DOCX-шаблоны с переменными ({{entity.field}}), генерация по клику | Интеграция с Drift Detection: предупреждение если реквизиты изменились |
| 52 | Настройки пользователя: язык, timezone, формат даты. Хранение в UTC, конвертация на UI | Два языка в v1 (русский, английский). Последний вид (список/канбан) запоминается |
Приложение А. Roadmap v2+¶
Все пункты отложены из v1 с сохранением фундамента в архитектуре.
А.1 Платформа и инфраструктура¶
| Направление | Описание |
|---|---|
| Self-hosted | Docker Compose, Helm chart, лицензионный сервер, MinIO, admin-панель on-premise |
| Мобильное приложение | Та же архитектура, другой UI |
| Live-редактирование | Совместная работа с разрешением конфликтов (оптимистичная блокировка → CRDT/OT) |
| Удаление неактивных организаций | Политика: 6 мес уведомление, 2 года hard delete |
А.2 Данные и MDM¶
| Направление | Описание |
|---|---|
| Org Master Data | Глобальный каталог контактов организации с синхронизацией (на базе identity_hash) |
| Кросс-проектная дедупликация | Поиск дублей между проектами одной организации |
| Кросс-проектные отчёты | Аналитика на уровне организации, а не проекта |
| Cross-Project Lineage (граф) | Визуальное дерево передач сделок между проектами |
А.3 Роли и доступ¶
| Направление | Описание |
|---|---|
| Кастомные роли | Конструктор ролей из матрицы прав |
| Кастомные поля | Доп. поля для контактов, сделок per-project |
| SSO / SAML | Enterprise-аутентификация |
А.4 Модули¶
| Направление | Описание |
|---|---|
| Маркетинг | Кампании с бюджетами, email-рассылки, UTM-трекинг, ROI |
| 🚗 Автосалон | Оценка trade-in, запись на показ, каталог авто (VIN, фото, статус) |
| 🍔 Общепит / Доставка | Меню с модификаторами, расширение продаж (адрес, курьер) |
| 🏠 Недвижимость | Объекты, показы |
А.5 Сделки и продажаы¶
| Направление | Описание |
|---|---|
| Мультивалютность | Конвертация, несколько валют в одном проекте |
| SLA per-стадия | Настраиваемые лимиты времени, предупреждения, эскалация (на базе stage_log) |
| SLA-индикаторы в канбане | Светофор: зелёный/жёлтый/красный по времени на стадии |
| Split-View канбан | Сделки + связанные продажаы в одном экране |
| Версионирование Order Type (детальное) | Миграции payload, обратная совместимость, UI обновления |
| Fuzzy merge | pg_trgm, расстояние Левенштейна для нечётких дублей |
| Circuit Breaker для webhook | Паттерн «предохранитель»: при массовых ошибках одного Order Type — пауза + алерт Admin |
А.6 UX и AI¶
| Направление | Описание |
|---|---|
| Drawer-Assistant (AI) | Парсинг текста/звонка в поля сделки, подсказка источника/продукта |
| Пользовательские шаблоны | Сохранить свой проект как шаблон для повторного использования |
А.7 Интеграции¶
| Направление | Описание |
|---|---|
| Входящая/исходящая почта привязанная к сделкам | |
| Телефония | Звонки, запись, привязка к карточкам |
| Мессенджеры | Telegram, WhatsApp |
| API / Webhooks | /p/:pid/settings/api для внешних систем |
| Обогащение по ИНН | Автозаполнение реквизитов компании из внешних сервисов |
| Уведомления | Глобальный центр уведомлений |
А.8 Экспорт¶
| Направление | Описание |
|---|---|
| Экспорт данных проекта | JSON / CSV выгрузка всех сущностей проекта |
| Экспорт отчётов | PDF / Excel выгрузка отчётов |
Документ является основой для проектирования frontend и backend. Не содержит деталей реализации — только бизнес-логика, роли, доступы, процессы и решения.