Модуль «Контакты» (3 экрана)¶
/p/:pid/contacts — Contacts List¶
Назначение: Список контактов проекта. Создание через Drawer. Доступ: Member+.
Компоновка:
├── Header + Sidebar проекта (пункт «Контакты» активен)
└── Main:
├── Заголовок: «Контакты» | Счётчик: 342 | Кнопка: [+ Контакт] → Drawer
│
├── Панель фильтров:
│ ├── 🔍 Поиск по имени, email, телефону
│ ├── Компания (multi-select)
│ ├── Дата создания (date range)
│ ├── Создатель (multi-select)
│ └── Есть сделки: Да / Нет / Все
│
├── Bulk actions (Manager+, появляется при выделении):
│ ├── ☑ Выделено: 5 | [Назначить] [Расшарить] [Удалить] [Экспорт]
│ └── ☑ Выделить все на странице | Выделить все (342)
│
└── Таблица:
| ☐ | Имя ▼ | Email | Телефон | Компании | Сделки | Создан |
| ☐ | Иванов И.И. | ivan@mail.com | +7 920 543... | Альфа, Бета | 3 | 15.01.26 |
| ☐ | Петрова А.С. | pet@mail.com | +7 916 123... | Гамма | 1 | 20.01.26 |
Клик на строку → /p/:pid/contacts/:id
Пагинация: «Показано 1–25 из 342» [25 ▼] [← 1 2 3 ... 14 →]
Empty state:
«В проекте пока нет контактов.»
«Создайте первый контакт или импортируйте из CSV.»
[+ Создать контакт] [Импорт CSV]
Drawer «Создание контакта»¶
Правая боковая панель:
├── Заголовок: «Новый контакт»
├── Поля (6-8 максимум):
│ ├── Имя* (input)
│ ├── Фамилия* (input)
│ ├── Email (input)
│ ├── Телефон (input, маска)
│ ├── Должность (input)
│ └── Компания: [Выбрать ▼] или «+ Новая» → раскрытие поля «Название компании»
├── Кнопка: [Создать]
└── Кнопка: [Отмена] или клик вне drawer
Проверка дублей:
При вводе email/телефона → фоновая проверка.
Если найден дубль → inline-предупреждение:
«Контакт с таким email уже существует. [Открыть]»
/p/:pid/contacts/:id — Contact Details¶
Назначение: Карточка контакта — полная информация, связи, история. Доступ: Member+ (по политике видимости).
Компоновка:
├── Header + Sidebar проекта
└── Main:
├── Шапка карточки:
│ ├── Аватар (инициалы / фото)
│ ├── Имя Фамилия
│ ├── Должность
│ ├── Email (клик → mailto) | Телефон (клик → tel)
│ ├── Владелец: Петрова А.С. | Создан: 15.01.2026
│ └── Действия: [Редактировать] [Расшарить] [Удалить] [⋮ Ещё: Merge, Передать]
│
├── Tabs:
│ ├── Обзор
│ ├── Сделки
│ ├── Компании
│ ├── Активности
│ └── История
│
├── Tab «Обзор»:
│ ├── Секция «Контактные данные»:
│ │ Email, телефон (доп.), адрес, соц. сети
│ ├── Секция «Компании» (карточки):
│ │ Альфа (Директор) | Бета (Консультант)
│ │ [+ Привязать компанию]
│ └── Секция «Последние сделки» (макс. 3):
│ Сделка «Альфа — ЗП» | Стадия: КП | 500 000 ₽
│
├── Tab «Сделки»:
│ Таблица всех сделок по этому контакту.
│
├── Tab «Компании»:
│ Список компаний (many-to-many). [+ Привязать] [✕ Отвязать]
│
├── Tab «Активности»:
│ Список задач/звонков/встреч привязанных к контакту.
│ [+ Активность] → Drawer с предзаполненной привязкой.
│
└── Tab «История»:
Лог событий (аудит): создание, изменения, привязка сделок, merge.
Каждая строка: время | кто | что изменил | diff.
/p/:pid/contacts/:id/edit — Edit Contact¶
Назначение: Редактирование контакта. Доступ: Member+ (по политике: свои, расшаренные).
Компоновка (форма):
├── Заголовок: «Редактирование — Иванов И.И.»
├── Все поля контакта (расширенный набор, не как в Drawer):
│ ├── Имя*, Фамилия*, Отчество
│ ├── Email, Доп. email
│ ├── Телефон (маска), Доп. телефон
│ ├── Должность
│ ├── Адрес
│ ├── Дата рождения
│ ├── Примечание (textarea)
│ └── Компании: multi-select из существующих
└── Кнопки: [Отмена] [Сохранить]
Drift Detection:
Если контакт привязан к сделкам/продажам и ключевые поля (телефон, email) изменены:
→ в карточках сделок/продаж появится предупреждение ⚠