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