From 1fd759732e9ab9cb161ca94f8ce69144b48e071e Mon Sep 17 00:00:00 2001 From: "gorbenko.pavel" Date: Fri, 2 Oct 2026 17:16:23 +0500 Subject: [PATCH] =?UTF-8?q?=D0=9E=D1=82=D0=BF=D1=83=D1=81=D0=BA:=20=D0=B8?= =?UTF-8?q?=D0=BD=D0=B8=D1=86=D0=B8=D0=B0=D1=82=D0=BE=D1=80=20=D0=B2=20?= =?UTF-8?q?=D0=AD=D0=94=D0=9E=20=E2=80=94=20=D0=B8=D1=81=D0=BF=D0=BE=D0=BB?= =?UTF-8?q?=D0=BD=D0=B8=D1=82=D0=B5=D0=BB=D1=8C=20=D0=B7=D0=B0=D1=8F=D0=B2?= =?UTF-8?q?=D0=BA=D0=B8=20(=D0=BF=D0=B5=D1=80=D0=B2=D1=8B=D0=B9=20=D0=B2?= =?UTF-8?q?=20=D1=84=D0=B0=D0=B7=D0=B5=20=D0=B8=D1=81=D0=BF=D0=BE=D0=BB?= =?UTF-8?q?=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F),=20=D0=B0=20=D0=BD=D0=B5=20?= =?UTF-8?q?=D1=81=D0=BE=D1=82=D1=80=D1=83=D0=B4=D0=BD=D0=B8=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 5.5 --- .../requestPortal/forms/Vacation/VacationView.tsx | 9 ++++++++- .../requestPortal/forms/Vacation/sendToSign.ts | 11 ++++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/webparts/requestPortal/forms/Vacation/VacationView.tsx b/src/webparts/requestPortal/forms/Vacation/VacationView.tsx index 073b0b2..f4d6d4c 100644 --- a/src/webparts/requestPortal/forms/Vacation/VacationView.tsx +++ b/src/webparts/requestPortal/forms/Vacation/VacationView.tsx @@ -17,6 +17,7 @@ import { useRequestTypeId } from '../../shared/approval'; import { isApprovalPhaseCompleted } from '../../shared/approval/models/statuses'; +import { executionPhaseRows } from '../../shared/approval/useRouteExecutors'; import { friendlyErrorMessage } from '../../shared/diagnostics'; import { approvalListTitle, @@ -152,7 +153,13 @@ const VacationView: React.FC = ({ context, itemId, formKey, setSigningError(''); setSigningResult(undefined); setSigningBusy(true); - return sendVacationForSigning(context, { data, employeeName, itemId, code }) + // Исполнитель — первый в фазе исполнения маршрута; берём свежие строки, а не те, что на экране: + // решение только что применено, и экран мог ещё не перечитать маршрут. + return approval + .getMatrixForRequest(itemId) + .then((rows) => executionPhaseRows(rows).filter((r) => r.email)[0]?.email) + .catch((): string | undefined => undefined) + .then((initiatorEmail) => sendVacationForSigning(context, { data, employeeName, itemId, code, initiatorEmail })) .then((result): string | undefined => { setSigningResult(result); return describeSigning(result, data.Employee); diff --git a/src/webparts/requestPortal/forms/Vacation/sendToSign.ts b/src/webparts/requestPortal/forms/Vacation/sendToSign.ts index 414ccfd..db6a78d 100644 --- a/src/webparts/requestPortal/forms/Vacation/sendToSign.ts +++ b/src/webparts/requestPortal/forms/Vacation/sendToSign.ts @@ -15,6 +15,11 @@ export interface IVacationToSign { /** Уникальный код заявки (`RequestUniqueCode`); пусто — берётся id. */ code: string; itemId: number; + /** + * Почта исполнителя заявки (тот, кто идёт в маршруте после согласующих): он «инициатор» в ЭДО, и + * на его почту придёт сообщение о подписи. Нет исполнителя в маршруте — инициатором будет сам сотрудник. + */ + initiatorEmail?: string; } /** Итог отправки: по каким компаниям документ ушёл и по каким нельзя. */ @@ -59,8 +64,8 @@ async function substituteName(context: WebPartContext, email: string): Promise