# План доработки модуля Tasks > На основе ТЗ п.3.6 --- ## Этап 1: RBAC + валидация (Готово ✅) - [x] `canCreate()` в create(), store() - [x] `canEdit()` в edit(), update(), moveColumn(), complete(), reopen() - [x] `canDelete()` в destroy() - [x] Валидация в store(), update() - [x] Исправлен нейминг событий: `task.*` (singular) --- ## Этап 2: Подзадачи (Subtasks) - Готово ✅ ### 2.1 Миграция ```php task_subtasks (id, task_id, title, is_completed, order_index, created_at) ``` ### 2.2 Модель + API - TaskSubtaskModel - addSubtask(), toggleSubtask(), deleteSubtask() ### 2.3 View - Отображение подзадач в task/show.twig - Чекбоксы для toggle Commit: cee6c63, 5bf25d9, 85a920b, f6aebd8 --- ## Этап 3: Вложения (Attachments) - Готово ✅ (общий сервис) ### 3.1 Общий AttachmentService ``` app/Services/AttachmentService.php app/Models/AttachmentModel.php app/Database/Migrations/2026-02-08-120000_CreateAttachmentsTable.php ``` ### 3.2 Структура таблицы ``` attachments (id, entity_type, entity_id, file_name, file_path, file_size, file_type, uploaded_by, timestamps) ``` ### 3.3 Использование Любой модуль может использовать AttachmentService: ```php $attachmentService->upload('task', $taskId, $file, $userId); $attachmentService->getByEntity('deal', $dealId); $attachmentService->delete('contact', $contactId, $attachmentId, $userId); ``` ### 3.4 Twig функции - `format_filesize($bytes)` - форматирование размера файла - `get_file_icon($fileType)` - иконка типа файла Commit: 052560c --- ## Этап 4: Комментарии + @mentions ### 4.1 Миграция ```php task_comments (id, task_id, user_id, content, mentioned_users(JSON), created_at) ``` ### 4.2 Обработка @mentions - Парсинг `@user_id` из текста - Создание уведомлений для упомянутых --- ## Этап 5: Зависимости задач ### 5.1 Миграция ```php task_dependencies (id, blocking_task_id, blocked_task_id, type) ``` ### 5.2 Логика - Проверка при completeTask(): если есть незавершённые blocking tasks — ошибка --- ## Этап 6: Интеграция CRM → Tasks ### 6.1 Events ```php Events::on('deal.created') → создать задачу "Первичный контакт" Events::on('deal.stage_changed') → при этапе "КП" создать задачу Events::on('deal.won') → создать задачу "Благодарность клиенту" ``` --- ## Этап 7: Интеграция Booking → Tasks ```php Events::on('booking.created') → создать задачу "Подготовка к встрече" ``` --- ## Приоритеты | Этап | Задача | Оценка | Статус | |------|--------|--------|--------| | 1 | RBAC + валидация | 4ч | ✅ Готово | | 2 | Подзадачи | 8ч | ✅ Готово | | 3 | Вложения | 8ч | ✅ Готово | | 4 | Комментарии + @mentions | 12ч | В процессе | | 5 | Зависимости | 6ч | - | | 6 | CRM → Tasks | 8ч | - | | 7 | Booking → Tasks | 4ч | - | **Готово:** 20ч | **Осталось:** ~30ч