Структура задачи: чек-лист, подзадачи, наблюдатели, связи
Задача перестаёт быть одной строкой: у неё появляются дата начала, чек-лист, подзадачи, наблюдатели и связь «начинается после окончания другой задачи» (ТЗ «Шаблоны, этапы и Гант…», раздел 3). Общий принцип — предупреждать, а не запрещать: незакрытый чек-лист, открытые подзадачи и неготовая предыдущая задача показываются в подтверждении, но действие проходит.
Реализовано: этап 1 — миграция
0187(tasks.start_date,tasks.parent_task_id,task_checklist_items,task_watchers,task_dependencies), кодinternal/modules/tasks/structure.go,repository_structure.go,transport_structure.go.
Дата начала
start_date — необязательная. Начало не позже срока (tasks_start_after_due), может быть в прошлом. Без начала задача точечная: на Ганте — ромбик срока, в загрузке плановые часы ложатся на рабочие дни перед сроком.
Чек-лист
Один список пунктов на задачу: текст, отметка, кто и когда отметил, порядок. У пункта нет исполнителя и срока — для этого подзадача.
- Добавлять, отмечать, править, удалять, менять порядок может тот, кто работает с задачей (исполнитель, соисполнители, управляющие), и её автор.
POST /tasks/:id/checklistпринимаетtitles[]; строка с переводами строк даёт пункт на строку, маркеры «- », «• », «1. », «2) » снимаются. Так же раскладывается ответ ИИ «Сформулировать».- Счётчики
checklist_total/checklist_doneприходят в списках задач и в карточке.
Подзадачи
Подзадача — обычная задача с parent_task_id. Один уровень: у подзадачи не может быть своих подзадач (tasks_subtask_of_subtask), задача с подзадачами не становится подзадачей (tasks_task_has_subtasks). Подзадача — в том же проекте, что родитель (tasks_parent_in_other_project).
- Свои исполнитель, срок, часы, чек-лист и статус; часы в родителя не суммируются.
GET /tasks/:id/subtasks— видит каждый, кто видит родителя. Счётчикиsubtask_total(без отменённых) иsubtask_done, подпись родителя —parent {id, title}.- Удаление родителя удаляет подзадачи (FK
ON DELETE CASCADE); интерфейс спрашивает подтверждение. - Фильтры списка:
parent_task_id,without_subtasks=true.
Наблюдатели
task_watchers. Наблюдатель видит задачу (canViewTask, видимость в списке), состоит в чате задачи и получает уведомления о ходе, но не меняет задачу.
POST/DELETE /tasks/:id/watch— себя (следить может тот, кто видит задачу);PUT /tasks/:id/watchers— состав целиком, право управления задачей.- Автор, отдавший задачу другому, становится наблюдателем автоматически.
Связи «после окончания»
task_dependencies (predecessor_id, successor_id, lag_days): задача начинается после окончания предыдущей с запасом в днях (может быть отрицательным). Только задачи одного проекта, круг запрещён (рекурсивная проверка в DependencyCreatesCycle).
- Карточка задачи (
GET /tasks/:id) отдаётpredecessors[]иsuccessors[]со статусом, исполнителем и датами. Список (GET /tasks) —predecessors[]только из задач той же выборки (task_id,lag_days) иcan_editу каждой задачи: этого хватает общему Ганту на странице «Задачи». - Начать задачу с незавершённой предыдущей можно — интерфейс спрашивает подтверждение.
POST /tasks/shift {task_ids, days}сдвигает начало и срок набора задач одной транзакцией (предложение «Сдвинуть следующие задачи?» и перетаскивание на Ганте). Проверка «срок не в прошлом» здесь не действует.
Уведомления
| Тип | Кому | Когда |
|---|---|---|
task.assigned | Новый исполнитель и соисполнители | Как раньше |
task.status_changed | Автор и наблюдатели, кроме сменившего | Завершена, отложена, возвращена из «Отложено». «Планируется → В работе» не шлётся |
task.comment | Исполнитель, соисполнители, автор, наблюдатели, кроме автора комментария | Новый комментарий |
task.predecessor_done | Исполнитель следующей задачи | Предыдущая завершена |
Отправка — taskNotificationAdapter.NotifyTaskEvent (internal/app/notification_adapters.go), ключ от повторов — тип + задача + получатель + событие.
Права
| Действие | Кто |
|---|---|
| Чек-лист | Работает с задачей (canWorkOnTask) или автор задачи |
| Подзадачи, связи, сдвиг, состав наблюдателей | Управляет задачей (manageTask); создать подзадачу — право создавать задачи в проекте |
| Следить | Видит задачу |