diff --git a/client/src/pages/FormEditor.tsx b/client/src/pages/FormEditor.tsx index 6291545..b948ab1 100644 --- a/client/src/pages/FormEditor.tsx +++ b/client/src/pages/FormEditor.tsx @@ -3869,6 +3869,9 @@ return function Layout({ ctx }) { +
+ Указанные пользователи/роли получают право выполнить этот переход. Ответственный задачи при переходе не меняется. +
{assigneeBlocks.map((block, bi) => { return ( diff --git a/server/services/task-transition.service.ts b/server/services/task-transition.service.ts index 572bd3e..34b987e 100644 --- a/server/services/task-transition.service.ts +++ b/server/services/task-transition.service.ts @@ -3,7 +3,6 @@ import { webhookService } from "./webhook.service"; import { eventBus, resolveTaskFieldTitles } from "../routes/shared"; import { pushTaskUpdated } from "../utils/pushTaskUpdated"; import { tasksMinimalCache } from "../utils/cache"; -import { notifyTaskAssigned } from "../utils/notifyAssignee"; import { indexTaskAsync } from "../routes/task-helpers"; import { fieldConditionsMatch, resolveFieldDisplayText, isFieldValueEmpty, SYSTEM_TASK_FIELDS, buildSystemFieldValuesForConditions } from "../utils/field-conditions"; import { validateRequiredFieldsDetailed } from "../utils/validate-required-fields"; @@ -181,7 +180,6 @@ export async function executeTaskTransition(options: ExecuteTaskTransitionOption let isAuthorized = false; let resolvedRoleId: number | null = null; // track role to assign after transition let resolvedAssigneeId: number | null = null; // old-format resolved user - let resolvedUserId: number | null = null; // new-format resolved user // Check direct assigneeUserId (Type A simple — backward compat) if (!isAuthorized && transition.assigneeUserId !== null && transition.assigneeUserId !== undefined) { @@ -203,7 +201,6 @@ export async function executeTaskTransition(options: ExecuteTaskTransitionOption if (!rulesMatch) continue; if (assignee.type === 'user' && assignee.id === user?.id) { - resolvedUserId = assignee.id; isAuthorized = true; break; } @@ -227,7 +224,6 @@ export async function executeTaskTransition(options: ExecuteTaskTransitionOption userId = fieldValue?.value ? parseInt(String(fieldValue.value)) : undefined; } if (userId && userId > 0 && userId === user?.id) { - resolvedUserId = userId; isAuthorized = true; break; } @@ -243,7 +239,6 @@ export async function executeTaskTransition(options: ExecuteTaskTransitionOption if (row) { const userId = parseInt(String((row.values as unknown[])[assignee.columnIndex as number] ?? '')); if (!isNaN(userId) && userId > 0 && userId === user?.id) { - resolvedUserId = userId; isAuthorized = true; break; } @@ -401,19 +396,10 @@ export async function executeTaskTransition(options: ExecuteTaskTransitionOption // Check if target status is final const isFinalStatus = toStatus?.isFinal || false; - // Determine assignee based on transition rules (priority: direct > old format > new format > preserve current) - let targetAssigneeId: number | null = null; - if (transition.assigneeUserId !== null && transition.assigneeUserId !== undefined) { - targetAssigneeId = transition.assigneeUserId; - } else if (resolvedAssigneeId !== null) { - targetAssigneeId = resolvedAssigneeId; - } else if (resolvedUserId !== null) { - targetAssigneeId = resolvedUserId; - } else { - // If the transition does not explicitly specify an assignee, keep the existing one - // instead of defaulting to the user who clicked the button. - targetAssigneeId = existingTask.assignedTo ?? null; - } + // «Согласующие» перехода (assigneeUserId / assigneeConditions) — это ТОЛЬКО + // авторизация (кто может выполнить переход). Они НЕ меняют ответственного задачи: + // ответственный всегда сохраняется, автоназначения при переходе нет. + const targetAssigneeId: number | null = existingTask.assignedTo ?? null; // Update task status const updateData: Record