← К списку версий
v0.15.0
31.07.2026
PATCH
История проектов + Задачи, добавленные вручную
Задачи, добавленные вручную (Задание 49)
- Миграция `2026_07_31_100001_add_task_sources_and_messages.php`:
- Модели: `TaskMessage`, `TaskAttachment`, а также связи и аксессоры в `Task` (`messages`, `visibleMessages`, `attachments`, `visibleAttachments`, `is_manual`, `source_label`), `visibleTasks` в `Project`.
- Администрирование (`AdminTaskController`):
- Синхронизация (`SyncManager`): задачи из платформы создаются/обновляются только при `source=synced`; ручные задачи защищены от перезаписи (пропускаются с `skipped`). Импортированным задачам проставляется `source=synced` и `sync_origin`. Исправлена запись несуществующего поля `progress`.
- Клиентские представления:
- Кнопки «Копировать» ссылок проекта: устойчивый fallback для `http://my.ipd.test` (без secure context) через `execCommand`; при неудаче — окно-подсказка с готовой ссылкой для ручного копирования.
- Срок действия ссылок: истёкшие токены явно помечаются (красный бейдж «Истекла» с датой) в админке и личном кабинете; в кабинете добавлена кнопка «Удалить» для истёкших/отозванных ссылок (`DELETE dashboard/projects/{id}/token/{tokenId}`).
- Создание задачи сразу с первой записью и файлом: в форме задачи — текст записи (звонок/встреча/заметка/письмо/чат), видимость записи, файл (до 20 МБ) и его видимость.
- Синхронизация: задачи без совпавшего локального проекта больше не создаются «висящими» без проекта (пропускаются с `skipped` — данные не теряются); в `sync_origin` записывается версия платформы (`Платформа · версия X`) и обновляется при каждой синхронизации.
- Миграция `2026_07_31_110000_add_task_work_fields.php`: у задач новые поля `need_from_us` («что нужно от нас»), `need_from_client` («что нужно от клиента») и флаг `protected_from_sync` (защита от перезаписи импортом). Защищённые задачи пропускаются синхронизацией (`skipped`), как и ручные.
- Клиентские страницы: задача показывает блоки «Нам нужно» / «Нужно от вас»; источник показывается нейтрально (Звонок/Встреча/Заказ/От клиента) без внутреннего ярлыка «Из платформы».
Добавлено
- `app/Services/ActivityLogger.php` единый сервис записи активности (`client_id`, `project_id`, `action`, `details`, `ip`, `user_agent`) с защитой от ошибок журналирования.
- Логирование действий администратора:
- Страница истории проекта маршрут `GET /admin/projects/{id}/history`, метод `AdminProjectController@history`, вьюха `resources/views/admin/projects/history.blade.php` (пагинация по 50 записей, колонки: дата, пользователь, действие, детали, IP).
- Секция «Последние изменения» на странице проекта — последние 10 записей активности со ссылкой «Вся история →».
Исправлено
- `app/Services/Sync/SyncManager.php` — `logSync` писал в несуществующие колонки (`entity_type`, `entity_id`, `entity_name`, `old_value`, `new_value`), которые отбрасывались массовым назначением. Теперь пишет в `project_id` (null) и `details` (JSON со статистикой и ошибкой).
- `importTasks` не писал несуществующую колонку `progress` (массовое назначение падало при синхронизации задач); поле удалено из `config/sync.php` (`entity_types.tasks.fields`).