Возможности системы TASKFLOW CRM
Этот документ описывает функциональные возможности системы на уровне бизнес-логики: что умеет система, какие есть модули, как они связаны. Технические детали — в разделах
core/иmodules/.
TASKFLOW CRM — система управления задачами и проектами для креативных агентств и личного использования. Построена на принципах DDD и Clean Architecture. API — RESTful, JSON.
Сводная таблица возможностей
| Область | Возможность | Модуль | Статус |
|---|---|---|---|
| Аутентификация | SSO-вход через внешний сервис Passport | passport/auth | ✅ |
| Аутентификация | Автоматический refresh токенов | passport/auth | ✅ |
| Аутентификация | Выход (proxy на Passport) | passport/auth | ✅ |
| Авторизация | Роли пользователей (user, admin) | core + rbac | ✅ |
| Авторизация | Разрешения (permissions) с wildcard-соответствием | rbac | ✅ |
| Авторизация | Контроль доступа к маршрутам (RBAC middleware) | rbac | ✅ |
| Пользователи | Синхронизация локальных пользователей с Passport | core | ✅ |
| Проекты | Создание/редактирование/удаление проектов | projects | ✅ |
| Проекты | Типы проектов (личный, командный…) | projects | ✅ |
| Проекты | Участники проекта и роли внутри проекта | projects | ✅ |
| Проекты | Приглашения по email и их принятие/отмена | projects | ✅ |
| Проекты | Автосоздание личного проекта при первом входе | projects | ✅ |
| Доски | Канбан-доски внутри проектов | projects + tasks | ✅ |
| Доски | Колонки досок с сортировкой (reorder) | tasks | ✅ |
| Задачи | Создание, редактирование, удаление задач | tasks | ✅ |
| Задачи | Мягкое удаление (soft delete) и восстановление | tasks | ✅ |
| Задачи | Жёсткое удаление (hard delete) | tasks | ✅ |
| Задачи | Назначение исполнителя (assign) | tasks | ✅ |
| Задачи | Перенос между колонками канбана | tasks | ✅ |
| Задачи | Вложенные задачи (parent_id) | tasks | ✅ |
| Задачи | Приоритеты задач | tasks | ✅ |
| Задачи | Дедлайны и признак просроченности | tasks | ✅ |
| Задачи | Комментарии к задачам | tasks | ✅ |
| Задачи | Стикеры/теги и привязка к задачам | tasks | ✅ |
| Тайм-трекинг | Таймеры (старт/стоп) | tasks | ✅ |
| Тайм-трекинг | Ручное логирование интервалов | tasks | ✅ |
| Тайм-трекинг | Планируемое время (planned fields) | tasks | ✅ |
| Тайм-трекинг | Дневная сводка (daily summary) | tasks | ✅ |
| Тайм-трекинг | Сводка времени по задаче | tasks | ✅ |
| Тайм-трекинг | Диаграмма занятости пользователя (busy chart) | tasks | ✅ |
| Тайм-трекинг | Автостарт таймера при назначении/переносе | tasks | ✅ |
| Уведомления | Email-уведомления (приглашения, обратная связь) | core + задачи | ✅ |
| Уведомления | Push/Telegram-каналы (каркас) | core | 🚧 каркас |
| Обратная связь | Оценка сервиса (4 критерия 0–5) | feedback | ✅ |
| Обратная связь | Идеи по улучшению | feedback | ✅ |
| Обратная связь | Статистика оценок | feedback | ✅ |
| Обратная связь | Email при не максимальной оценке | feedback | ✅ |
| Документация | Swagger/OpenAPI + Markdown-доки в вебе | core | ✅ |
🚧 — реализован каркас, полная интеграция в планах (см. known-issues-and-roadmap).
Ключевые пользовательские сценарии
1. Вход в систему (SSO)
- Пользователь открывает фронтенд и нажимает «Войти».
- Фронтенд редиректит на
GET /auth/loginAPI. - API создаёт
state(случайная строка, кукаtaskflow_oauth_stateна 10 минут) и редиректит на Passport/auth/authorize. - Пользователь входит на Passport, Passport редиректит обратно на
GET /auth/callback?code=...&state=.... - API меняет
codeна пару токенов (access + refresh), кладёт их в httpOnly-куки и редиректит на фронтенд. - При первом входе создаётся личный проект пользователя.
2. Работа с задачами на канбан-доске
- Пользователь открывает проект → видит доску с колонками.
- При переносе задачи в другую колонку вызывается
POST task/<id>/move-to-column. - Задача может быть назначена исполнителю (
POST task/<id>/assign). - Если колонка/назначение меняются — система может автоматически запустить таймер учета времени.
3. Учёт рабочего времени
- Пользователь запускает таймер (
POST time-interval/start), останавливает (POST time-interval/stop). - Можно добавить интервал вручную (
POST time-interval). - Система ведёт daily summary и считает время по задачам; строит диаграмму занятости пользователя.
4. Приглашение участника в проект
- Владелец проекта вызывает
POST project/<id>/inviteс email. - Система создаёт приглашение и отправляет email.
- Пользователь переходит по ссылке, вызывает
POST invitation/accept— становится участником. - Приглашение можно отменить (
DELETE project/<id>/invitation).
5. Обратная связь
- Пользователь ставит оценку (скорость, функциональность, дизайн, удобство) —
POST feedback/rating. - Если оценка не максимальная — на email приходит письмо с просьбой рассказать о проблемах.
- Пользователь может отправить идею —
POST feedback/idea.
Модули и их взаимодействие
graph LR
subgraph Внешние системы
PASS[Passport<br/>SSO / OAuth2]
end
subgraph API
AUTH[modules/passport/auth]
RBAC[modules/rbac]
PROJ[modules/projects]
TASKS[modules/tasks]
FEED[modules/feedback]
CORE[core<br/>users, roles, events,<br/>notifications, errors]
end
AUTH -->|JWT-токены| CORE
AUTH -->|SyncUser| CORE
RBAC -->|проверка маршрутов| CORE
PROJ -->|UserFirstLoginEvent| CORE
TASKS -->|доски, доступ| PROJ
TASKS -->|события/уведомления| CORE
FEED -->|RatingSubmittedEvent| CORE
PROJ -->|события/уведомления| CORE
Ключевые точки интеграции:
- passport/auth → core:
SyncUserHandlerсоздаёт/обновляет локального пользователя по данным Passport. - rbac → core:
RbacMiddlewareиспользуетYiiIdentityи разрешения; middleware вызывается глобально черезbeforeRequest. - projects → core: слушатель
CreatePersonalProjectOnUserFirstLoginподписан на глобальное событиеUserFirstLoginEvent. - tasks → projects:
TaskAccessиITaskAccessделегируют проверку прав на доску вIProjectAccess(проекты владеют досками). - feedback → core: слушатель
SendNonMaxRatingEmailListenerподписан наRatingSubmittedEventи шлёт письма черезNotificationHub.
Подробности взаимодействия — в диаграммах и документации каждого модуля.
Форматы ответов API (кратко)
Все ответы имеют единую структуру (подробно: фронтенд-гид):
| Обёртка | Формат |
|---|---|
| Один объект | { "item": { ... } } |
| Список | { "items": [ ... ], "_meta": { "total", "page", "limit", "pages" } } |
| Успех без данных | { "message": "OK" } |
| Ошибка | { "error": { "code", "message", "details" } } |