feat: замещение пользователей (substitution) — заместители по умолчанию и по формам, контур ознакомления, inbox reasons
- таблица user_delegations (миграция 0067) + колонки delegated_from_user_id/pending_review в task_assignees - delegation.service: резолвер с цепочкой и защитой от циклов, bulk-до-назначение чанками, чистка истёкших замещений - центральный хук в addTaskAssignee: заместитель добавляется при любом назначении (ручном, автопереходе, user-поле, MCP) - контур ознакомления: после перехода отсутствующий остаётся в исполнителях с pending_review, снимается кнопкой «Ознакомлен» - inbox reasons delegation/delegation_review + фильтр «Замещение» на главной - блок «Замещение» в профиле пользователя, бейдж «за <имя>» и баннер ознакомления в карточке задачи
This commit is contained in:
@@ -16,6 +16,7 @@ import { indexTaskAsync } from "../routes/task-helpers";
|
||||
import { webhookService } from "../services/webhook.service";
|
||||
import { pushTaskUpdated } from "../utils/pushTaskUpdated";
|
||||
import { notifyTaskAssigned } from "../utils/notifyAssignee";
|
||||
import { ensureReviewAssignees, cleanupStaleDelegates } from "../services/delegation.service";
|
||||
|
||||
export interface EvaluateAutoTransitionsOptions {
|
||||
triggeredBy?: number | null;
|
||||
@@ -277,6 +278,11 @@ async function applyAutoTransition(
|
||||
await storage.addTaskAssignee(task.id, targetAssigneeId, organizationId).catch(() => {});
|
||||
}
|
||||
|
||||
// Замещение: вернуть отсутствующих исполнителей «на ознакомление»
|
||||
// и снять заместителей с истёкшим замещением
|
||||
await ensureReviewAssignees(task.id, organizationId);
|
||||
await cleanupStaleDelegates(task.id, organizationId);
|
||||
|
||||
// Audit log — автопереход записывается от имени системы
|
||||
storage
|
||||
.addTaskAuditLog({
|
||||
|
||||
Reference in New Issue
Block a user