О платформе Войти
← К списку версий
v0.79.0 27.09.2026 MINOR
Проекты клиента: отдельная страница с источником каждого проекта и отключением лишних
ТЗ 250 «Проекты клиента». Список проектов человека вынесен с карточки пользователя на отдельную страницу /admin/users/{id}/projects и отвечает на вопрос «почему их восемь, если проект один». Для каждого проекта видно, откуда он: пришёл с платформы задач (с её ID и датой синхронизации) или создан вручную в my.ipd, роль человека (владелец или участник), статус, дата добавления и реальное число задач. Отдельный блок «Откуда взялись проекты» объясняет состав портфеля цифрами, а проекты без задач и без связи с платформой помечаются как «Без задач», а созданные в одну секунду одинаковыми заходами у разных клиентов — как «Массовое добавление». Лишний проект можно отключить одним действием из меню «⋮»: он уходит в архив, перестаёт быть активным и попадать в отчёты и письма, но задачи и история остаются на месте, а действие обратимо.
Что сделано
  • Отдельная страница - Новая страница /admin/users/{id}/projects (маршрут admin.users.projects, Admin\AdminUserController@projects, вьюха resources/views/admin/users/projects.blade.php) со своим адресом: сводка, объяснение состава, фильтр по разделам «Все / Активные / Отключённые и закрытые», таблица проектов и действия в кебаб-меню. Карточка «Проекты (всего)» на странице пользователя стала ссылкой на неё, в разделе «Проекты» вместо таблицы — кнопки «Все проекты клиента» и «Проверить проекты на платформе задач».
  • Откуда взялся каждый проект - Новая функция ClientPortfolioService::explainPortfolio() разбирает портфель человека: источник (external_id платформы задач с датой синхронизации или ручное создание с датой добавления), роль (владелец/участник), статус, прогресс, дата завершения, реальное число задач одним сгруппированным запросом и число «пустых» проектов. Массовое добавление определяется по одинаковой секунде created_at: если в эту секунду появились такие же проекты (в том числе у других клиентов) — проект помечается как массовый, с указанием, сколько их было.
  • Почему список длиннее, чем кажется - На странице сводка (всего, активных, отключённых и закрытых, с платформы задач, создано вручную, без задач) и блок «Откуда взялись проекты» с пояснением по каждой группе. На тестовом стенде это объяснило клиента №5: 3 проекта с платформы задач (Бобер Боб, Mysteria, Алексей Гапеев) и 5 созданных вручную 25.09.2026 в 20:40 одним заходом вместе с такими же проектами 19 других клиентов (всего 95 штук) — пустые, без задач.
  • Управление проектом - Отключение и возврат в работу одним действием из кебаб-меню строки (POST /admin/users/{id}/projects/{projectId}/status, admin.users.projects.status): отключение ставит статус archived, возврат — active. Проект не удаляется: задачи, история и карточка остаются. Действие пишется в журнал (user_project_disabled / user_project_enabled). Защиты: нельзя отключить текущий проект и нельзя отключить последний активный проект человека — сначала нужно выбрать другой текущий проект; нельзя отключить проект, который человеку не принадлежит.
  • Проверка - Новый тест tests/Feature/ClientProjectsPageTest.php — 13 проверок: свой адрес и состав списка, источники и ID платформы, пометки «Без задач» и «Массовое добавление», фильтр разделов, отключение и возврат с журналом, защита текущего проекта (выбранного и выбранного автоматически), защита последнего активного, чужой проект, ссылка со страницы пользователя, рендер без проектов и завершённого проекта. Существующий тест ClientPortfolioFeatureTest переведён на новую страницу. Полный прогон: 267 тестов (1559 проверок), сборка CSS и php artisan view:cache — без ошибок.
  • Версия - Текущая версия платформы: v0.79.0 (.env, .env.example, config/app.php, VersionSeeder, README.md, DESIGN_SYSTEM.md).
Результат
  • У человека виден весь портфель проектов на отдельной странице, у каждого проекта указан источник и дата, лишние пустые проекты опознаются как массовое добавление и отключаются одним действием без удаления данных.