Розробка системи управління задачами (Task Management)
Task Management — більш вузький клас систем, ніж Project Management. Фокус — не на плануванні та діаграмах Ганта, а на потоці задач: створення, назначення, виконання, контроль. Типові сценарії заказної розробки: операційні команди з нестандартним воркфлоу, системи обробки заявок всередину компанії, трекери виробничих процесів, де задача привязана до фізичного об'єкту.
Доменна модель
Мінімально жизнеспособна модель задачі:
CREATE TABLE tasks (
id BIGSERIAL PRIMARY KEY,
title VARCHAR(500) NOT NULL,
description TEXT,
status VARCHAR(50) NOT NULL DEFAULT 'todo',
priority SMALLINT NOT NULL DEFAULT 2, -- 1=low, 2=medium, 3=high, 4=critical
assignee_id BIGINT REFERENCES users(id),
reporter_id BIGINT NOT NULL REFERENCES users(id),
team_id BIGINT REFERENCES teams(id),
due_date DATE,
completed_at TIMESTAMPTZ,
parent_id BIGINT REFERENCES tasks(id),
position INTEGER, -- порядок в списке/колонке
metadata JSONB DEFAULT '{}', -- кастомні поля
created_at TIMESTAMPTZ DEFAULT now()
);
Поле metadata (JSONB) вирішує проблему кастомних полів без зміни схеми. Різні типи задач мають різні набори полів: задача для маркетингу містить campaign_id, задача для HR — position_id. Індексуємо потрібні поля: CREATE INDEX ON tasks ((metadata->>'campaign_id')).
Воркфлоу та статусы
Ключова відмінність заказной системи від Trello — настраіваємий воркфлоу з правилами переходів. Не просто перетащити карточку в будь-яку колонку, а строга state machine з guards:
- Задачу можна перевести в «На перевірці» тільки якщо є виконавець
- «Закрито» вимагає заповненого поля «Результат»
- Переход в «Відмінено» доступний тільки менеджеру або автору
// XState конфіг
const taskMachine = createMachine({
id: 'task',
initial: 'todo',
states: {
todo: { on: { START: 'in_progress', CANCEL: 'cancelled' } },
in_progress: { on: { REVIEW: 'in_review', BLOCK: 'blocked' } },
blocked: { on: { UNBLOCK: 'in_progress' } },
in_review: { on: { APPROVE: 'done', REJECT: 'in_progress' } },
done: { on: { REOPEN: 'todo' } },
cancelled: { type: 'final' },
},
});
Конфіг воркфлоу зберігається в базі (JSON), редагується через візуальний редактор.
Представлення: список, Kanban, таблиця
Список задач — основне представлення. Віртуалізований скролл (TanStack Virtual) при > 100 задач, групування по будь-якому полю, сортування мультиполем.
Kanban: колонки = статусы текущого воркфлоу. Drag-and-drop через @dnd-kit/sortable. При перетаскуванні між колонками — перевірка дозволеного переходу на клієнті.
Таблиця (spreadsheet-вид): кожна задача — строка, поля — колонки. Редактування inline. Масові операції: вибрати 20 задач, назначити виконавця, змінити дедлайн. Використовуємо TanStack Table.
Масові операції та автоматизація
Масові операції часто упускаються:
- Переназначення групи задач на іншого виконавця
- Масове закриття по фільтру
- Копіювання/переміщення задач між проектами
Автоматизація (trigerred rules): «Якщо задача не взята в роботу через 2 години після назначення — нагадати виконавцю та сповістити менеджера». Через scheduled jobs, які опитують задачи по умовам та виконують дії. Правила автоматизації зберігаються в БД, редагуються через UI.
Сповіщення та SLA-контроль
Для операційних систем критичний контроль SLA: задача повинна бути взята в роботу не пізніше ніж через N годин від створення.
class CheckTaskSlaJob implements ShouldQueue
{
public function handle(): void
{
$overdueTask = Task::query()
->where('status', 'todo')
->where('created_at', '<', now()->subHours($this->slaHours))
->whereNull('assignee_id')
->get();
foreach ($overdueTask as $task) {
Notification::send($task->team->managers, new SlaBreachedNotification($task));
}
}
}
Матриця еscalation: просрочка 1ч → email виконавцю, 4ч → email + Slack менеджеру, 8ч → сповіщення керівнику.
Сроки
- Проектування воркфлоу та даних — 1–2 нед.
- Бэкенд (задачи, права, API) — 3–4 нед.
- Фронтенд (список + Kanban + таблиця) — 3–4 нед.
- Сповіщення, SLA, автоматизація — 2 нед.
- Тестування та запуск — 1 нед.
Разом: 10–13 тижнів. Перша робоча версія з базовим воркфлоу та двома представленнями — 6–7 тижнів.







