← К списку версий
v0.90.1
01.10.2026
PATCH
Задачи только с платформы: убран мусор, снято 196 ложных пометок
ТЗ 271 «Задачи велись в двух местах». Задачи приходят с платформы task.ipd, но в MY IPD у синхро-задач были свои формы правки: маршруты create/store/edit/update/destroy и отдельный AdminStepController для шагов. Правка жила до следующей синхронизации и затиралась, удалённая задача возвращалась из выгрузки снова. Для синхро-задач маршруты правки удалены, карточка задачи только читается, кнопка «+ Задача» на странице проекта убрана; удаление осталось только в сверке мусора. Причина заваленности базы: 1112 синхро-задач, из них 327 на платформе нет вообще (тестовые D-04…D-111 и прочие), а 196 задач были ошибочно помечены «нет на платформе» — синхронизация сверялась по ответам на отдельные запросы вместо полного списка задач платформы. Предпросмотр и SyncManager теперь считают известные идентификаторы по объединению всех источников. Добавлена команда tasks:reconcile-platform с режимами --dry-run, --restore, --purge. На TEST удалено 327 задач и 20 шагов, 196 задач восстановлено. Версия v0.90.1.
Что сделано
- Задачи только читаются - У синхро-задач убраны маршруты create/store/edit/update/destroy и AdminStepController, удалены шаблоны tasks/create.blade.php и tasks/edit.blade.php. Карточка задачи показывает шаги, пришедшие с платформы («Шаги приходят с платформы задач»), ничего не редактируя на месте. Клиентские ТЗ (client_tasks) не затронуты.
- Ложные пометки «нет на платформе» - 196 задач были помечены как отсутствующие на платформе, потому что синхронизация сверялась с ответами на отдельные запросы, а не с полным списком задач платформы. Такие задачи скрывались у клиента и попадали в отчёт об удалённых. Сверка теперь идёт по объединению известных идентификаторов (knownIds ∪ remoteTaskIds) в предпросмотре и в SyncManager при загрузке ответа задачи.
- Команда tasks:reconcile-platform - Сверяет локальные синхро-задачи с платформой и показывает четыре группы: есть на платформе, нет на платформе, ошибочно помеченные, скрытый мусор без пометки. Режимы: --dry-run (только отчёт, по умолчанию), --restore (снять ложные пометки, вернуть видимость клиенту), --purge (удалить отсутствующие на платформе), --yes (без подтверждения), --project (один проект). Всё в одной транзакции с откатом при ошибке.
- Удаление задачи чистит всё - Task::purgeWithRelations() удаляет задачу вместе со шагами, сообщениями и вложениями, включая файлы на приватном диске. Раньше удаление из контроллера трогало только запись в tasks, а файлы вложений оставались на диске. Этим же методом пользуются одиночное и массовое удаление мусора.
Почищено на TEST
- Удалено 327 задач, которых нет на платформе - Тестовые задачи D-04…D-111, «Тестовая задача», «Тестовая задача E2E» и прочие; вместе с ними удалено 20 шагов. Скрытого мусора (нет на платформе, но без пометки) не оказалось — синхронизация пометила всё, что не нашла.
- Возвращено 196 задач - Снята пометка «нет на платформе», включена видимость клиенту. Итог сверки: локальных синхро-задач 785, есть на платформе 785, нет на платформе 0, ошибочно помеченных 0.
- Пересчитаны счётчики проектов - tasks_total/tasks_completed в 41 проекте совпадают с фактическим числом задач, расхождений 0.
- Проверка целостности ссылок - Сирот нет в tasks.project_id, steps.task_id, task_messages.task_id, task_attachments.task_id, support_requests.task_id.
- Бэкап - storage/app/private/my_ipd_local_before_task_purge_2026-10-01_142538.sql (24,5 МБ, проверен импортом в чистую базу my_ipd_restore_check).
Результат
- Задачу нельзя случайно испортить в MY IPD: она приходит с платформы и только читается, а в базе не остаётся мусора и ложных отметок об отсутствии задачи на платформе.