Отпуск: инициатор в ЭДО — исполнитель заявки (первый в фазе исполнения), а не сотрудник
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -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
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user