Отпуск: инициатор в ЭДО — исполнитель заявки (первый в фазе исполнения), а не сотрудник

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
gorbenko.pavel
2026-10-02 17:16:23 +05:00
parent 911ccfbcf4
commit 1fd759732e
2 changed files with 16 additions and 4 deletions
@@ -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<IVacationViewProps> = ({ 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);
@@ -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<s
* Запрос один на все файлы: ЭДО принимает его целиком или отклоняет целиком (например, если у
* одной из компаний нет сертификата), поэтому «часть ушла, часть нет» не бывает и повтор безопасен.
*
* Подписывает сотрудник, указанный в заявке (он же «инициатор»): ему уходят приглашения, и на его
* почту ЭДО сообщит о подписи. ИИН и БИН берутся из справочников api.tnsu.kz.
* Подписывает сотрудник, указанный в заявке: ему уходят приглашения. Инициатор — исполнитель заявки:
* на его почту ЭДО сообщит о подписи. ИИН и БИН берутся из справочников api.tnsu.kz.
*/
export async function sendVacationForSigning(
context: WebPartContext,
@@ -107,7 +112,7 @@ export async function sendVacationForSigning(
const accepted = await submitSigningRequest(context, {
recipient: { iin: targets.iin, email: data.Employee, name: targets.name },
initiatorEmail: data.Employee,
initiatorEmail: vacation.initiatorEmail || data.Employee,
files
});