О платформе Войти
← К списку версий
v0.92.0 02.10.2026 MINOR
Одна кнопка на всех: люди, проекты, связи и задачи за один проход
ТЗ 273 «Люди загрузились, а проектов у них нет». Загрузка людей и загрузка проектов были разными кнопками в двух мастерах, и порядок зависел от того, какую нажали: люди успевали появиться раньше проектов — и проект оставался без владельца, а у клиента не появлялось ни одного проекта. Причина в сопоставлении: у человека без почты на площадке person_external_id пустой, а почта в карточке проекта и в списке людей расходится, поэтому владелец не находился вообще. Теперь одна кнопка «Синхронизировать всё» делает всё в правильном порядке (направления → люди → проекты → связи «человек → проект» → задачи) и одной транзакцией, а владелец проекта ищется через общий список людей по person_id — это работает и без почты. Версия v0.92.0.
Что сделано
  • Одна кнопка вместо трёх - На странице «Синхронизация данных» (/admin/sync) — кнопка «Синхронизировать всё с платформы задач». За один проход и в одной транзакции: направления → люди → проекты (с владельцем) → связи «человек → проект» → задачи и шаги. Письма по задачам не отправляются: массовый импорт не должен слать клиентам письма, их готовят мастера писем отдельно. После запуска — страница итога с цифрами: сколько людей, проектов, связей и задач создано и обновлено.
  • Владелец проекта находится и без почты - Порядок поиска: person_external_id → person_id через общий список людей выгрузки (PersonMatcher: внешний id, почта, затем имя + организация) → person_email из карточки проекта → person_name. Раньше использовались только person_external_id и person_email, поэтому у человека без почты владелец не находился никогда. Связь по person_id однозначна: 41 проект из 41 сопоставляется с человеком из списка людей.
  • Связи внутри того же прохода - Привязка людей к проектам перенесена в тот же запуск и ту же транзакцию, что и импорт проектов (linkClientsToProjectsFromPayload), и работает по уже полученной выгрузке — без второго обращения к платформе. Владелец участником не дублируется.
  • Повторный запуск чинит накопленное - Кнопка безопасна для повторов: связи только добавляются, владелец проставляется, если его нет, люди и проекты не создаются заново. Поэтому один запуск закрывает и уже накопившийся долг, без ручной доводки по спискам.
Найдено в данных
  • 2 проекта были без владельца - «Медтехника Гродно» (проект 9 на площадке) и «АльденаГрупп — сопровождение и развитие (2026)» (4509).
  • 5 клиентов были без единого проекта - Воронов Вадим, Калита Алексей, Михнюк Дмитрий, Покалюк Денис (ООО «АльденаГрупп») и Кипеть Александр (РУП «Медтехника» Могилёв) — ровно участники этих двух проектов. Все без почты, поэтому и не находились.
  • 20 задач без проекта — это другое - Их проектов уже нет на платформе (личные и архивные проекты IPD). Не трогались: это случай осиротевших задач, а не синхронизации.
Проверено
  • 5 тестов на полную синхронизацию - tests/Feature/FullPlatformSyncTest.php: владелец без почты находится по person_id и появляется владельцем проекта; все участники получают проект в том же запуске; владелец не дублируется участником; второй запуск ничего не создаёт и не ломает; проект, оставшийся без владельца, получает его при следующем запуске; кнопка и страница итога работают через HTTP.
  • Полный набор тестов зелёный - 403 теста, падений нет.
Результат
  • Одна кнопка приводит людей, проекты и задачи с платформы в согласованное состояние: у каждого проекта есть владелец, у каждого клиента есть его проекты.