feat: заявление на отпуск — по файлу на каждую компанию совместителя одним запросом в ЭДО

Сотрудник заполняет заявку один раз, а в ЭДО уходит по документу на каждую компанию, где он
работает: своя шапка (компания, должность) и свой БИН в массиве file_company_bins. Подписант один —
сам сотрудник, от имени физлица. Запрос один на все файлы: принимается целиком или отклоняется
целиком, повтор безопасен. Компания без БИН в справочнике пропускается и показывается в сообщении.

Удалять согласующих при составлении может редактор маршрута (во всех формах, не только в трёх).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
gorbenko.pavel
2026-10-02 14:48:33 +05:00
parent 8cdee83496
commit 7f5f59fc81
8 changed files with 241 additions and 122 deletions
@@ -7,15 +7,21 @@ import { IFioParts } from './fio';
/** Путь приёма документов на подпись от интеграций (TANSU ЭДО, multipart/form-data). */
const SIGNING_REQUESTS_PATH = '/api/v1/integration/signing-requests';
/** Что отправляем в ЭДО: одного получателя, он же подписант, и один файл. */
/** Файл на подпись и компания, от имени которой он идёт (по её сертификату Sigex в ЭДО). */
export interface IEdoSigningFile {
name: string;
content: Blob;
/** БИН компании файла. У сотрудника-совместителя файлы одного запроса идут от разных компаний. */
companyBin: string;
}
/** Что отправляем в ЭДО: одного получателя, он же подписант (физлицо), и файлы. */
export interface IEdoSigningRequest {
/** Подписывающий: ЭДО заводит его по ИИН, если нет, и зовёт подписать письмом. */
recipient: { iin: string; email: string; name: IFioParts };
/** БИН компании, от имени которой документ идёт на подпись (нужен сертификат Sigex этой компании в ЭДО). */
companyBin: string;
/** Кому сообщать о подписи. */
initiatorEmail: string;
file: { name: string; content: Blob };
files: IEdoSigningFile[];
}
/** Ответ ЭДО: то, что нужно показать пользователю. */
@@ -32,7 +38,7 @@ interface IEdoResponseBody {
}
/**
* Отправляет документ на подпись в ЭДО.
* Отправляет документы на подпись в ЭДО одним запросом: либо принимаются все, либо ни один.
*
* Токен берётся для приложения ЭДО текущего пользователя (AadHttpClient), поэтому в ЭДО
* запрос приходит от того, кто нажал «Согласовать», — он заводится там автоматически при
@@ -52,9 +58,12 @@ export async function submitSigningRequest(
form.append('last_name', request.recipient.name.lastName);
form.append('first_name', request.recipient.name.firstName);
if (request.recipient.name.middleName) form.append('middle_name', request.recipient.name.middleName);
form.append('company_bin', request.companyBin);
form.append('initiator_email', request.initiatorEmail);
form.append('files', request.file.content, request.file.name);
// БИН файлов — массивом, по порядку файлов: общий company_bin не нужен, подписант один (физлицо).
for (const file of request.files) {
form.append('files', file.content, file.name);
form.append('file_company_bins', file.companyBin);
}
let response: HttpClientResponse;
try {