← К списку версий
v0.77.0
25.09.2026
MINOR
Несколько проектов у человека: статусы, даты завершения, текущий проект
Человек может вести несколько проектов, и my.ipd теперь показывает их все, а не один. Страница пользователя (/admin/users/{id}) выводит все проекты человека, включая завершённые и архивные: роль, статус, этап платформы задач, дату завершения, прогресс, задачи, синхронизацию. Появился «текущий проект» — тот, по которому идут отчёты и письма: он определяется автоматически (самый свежий по дате синхронизации среди активных проектов), но администратор может выбрать проект вручную или вернуть автоматику. Закрытые проекты текущими не становятся и в отчёты и письма не попадают. Синхронизация клиента теперь забирает с платформы задач и завершённые проекты, из выгрузки читаются дата завершения и признак завершения, статус платформы «архив» больше не превращается в «активен» — это отдельный статус «В архиве». Кнопка «Проверить проекты на платформе задач» показывает, что есть на платформе у этого человека, чего нет в my.ipd, и импортирует выбранные проекты, не перезаписывая локальные названия.
Что сделано
- Все проекты человека на странице пользователя — блок «Проекты (N)» на /admin/users/{id}: роль (владелец/участник), статус, этап, дата завершения, прогресс, задачи, синхронизация, действия; карточки «Проекты (всего)» и «Текущий проект». Завершённые и архивные проекты видны в конце списка, для закрытых показывается причина («статус платформы: завершено»).
- Текущий проект — `Client::resolveCurrentProject()`: ручной выбор (clients.current_project_id) или автоматика — самый свежий активный проект по last_synced_at, затем updated_at, затем id; форма выбора на странице пользователя с вариантом «Автоматически», маршрут admin.users.current-project, закрытый проект текущим стать не может.
- Отчёты и письма только по активным проектам — `Client::reportProjects()` (текущий первым) используется в mail:send-reports, mail:send-monthly, upcoming-письмах и превью писем; уведомления по событиям закрытые проекты не создают (`Project::isClosed()`).
- Проверка проектов на платформе задач — страница /admin/users/{id}/projects/platform (admin.users.platform-projects) показывает проекты человека на task.ipd.test: статус, дату завершения, этап, прогресс, задачи, ссылку на проект и отметку «есть в my.ipd»; выбранные проекты импортируются кнопкой (admin.users.import-platform-projects), локальные названия не перезаписываются.
- Синхронизация забирает завершённые проекты — во все выгрузки добавлен include_completed=1; `TaskExportNormalizer` понимает ключи «завершён» и «дата_завершения»; при импорте сохраняются platform_status, completed_at, stage и признак личного проекта из блока «люди → проекты».
- Статусы — у платформы появился статус «архив» (проект закрыт и убран в архив), в my.ipd это статус archived «В архиве» в фильтрах, списках и на странице проекта; константы Project::STATUS_* и CLOSED_STATUSES вместо строковых литералов; в редакторе проекта поле «Дата завершения».
- Новые поля базы — projects.completed_at, projects.platform_status, projects.stage, projects.is_personal, clients.current_project_id (миграция add_portfolio_fields_to_projects_and_clients).
- Ссылка на проект ведёт на тестовую платформу — на странице проекта ссылка на проект на платформе задач теперь ведёт на task.ipd.test, а не на продакшн task.ipd.by.
- Сервис портфеля — app/Services/Sync/ClientPortfolioService.php: локальные проекты человека (текущий → активные → закрытые), проекты на платформе, принадлежность проекта/человека клиенту, подписи этапов и дат; используется и SyncManager, и контроллером пользователей.
- Версия платформы — тестовая версия поднята до v0.77.0 (.env, .env.example, config/app.php, VersionSeeder, README.md).
Результат
- У человека виден весь портфель проектов с этапами и датами завершения, отчёты и письма идут ровно по одному актуальному проекту, а недостающие проекты можно сверить с платформой задач и импортировать в пару кликов.