Merge branch 'main' of http://git.tnsu.kz/timur.gorodetskiy/request-portal
Tests / frontend-test (push) Successful in 1m25s

This commit is contained in:
Тимур Городецкий
2026-10-27 15:33:45 +05:00
3 changed files with 29 additions and 13 deletions
@@ -30,6 +30,9 @@
- **Заголовок элемента** (`Title`): `Отпуск — {ФИО} — дд.мм.гггг`. - **Заголовок элемента** (`Title`): `Отпуск — {ФИО} — дд.мм.гггг`.
## Подписание в ЭДО ## Подписание в ЭДО
> **Сейчас выключено** (`VACATION_EDO_SIGNING_ENABLED = false` в `shared/config.ts`): решение последнего
> согласующего применяется сразу, в ЭДО ничего не уходит. Описанное ниже работает, когда флаг `true`.
Когда **последний согласующий** нажимает «Согласовать», заявление сначала уходит на подпись в TANSU ЭДО Когда **последний согласующий** нажимает «Согласовать», заявление сначала уходит на подпись в TANSU ЭДО
(`VacationView` → `onBeforeDecide`), и только потом применяется решение. Последний — значит заявка (`VacationView` → `onBeforeDecide`), и только потом применяется решение. Последний — значит заявка
«На согласовании» и несогласованной осталась одна строка фазы согласования (`completesApprovalPhase`; «На согласовании» и несогласованной осталась одна строка фазы согласования (`completesApprovalPhase`;
@@ -30,6 +30,7 @@ import type { ApproverDecision } from '../../shared/approval';
import { isAlreadyAccepted } from '../../shared/edo/edoErrors'; import { isAlreadyAccepted } from '../../shared/edo/edoErrors';
import { executionPhaseRows } from '../../shared/approval/useRouteExecutors'; import { executionPhaseRows } from '../../shared/approval/useRouteExecutors';
import { friendlyErrorMessage } from '../../shared/diagnostics'; import { friendlyErrorMessage } from '../../shared/diagnostics';
import { VACATION_EDO_SIGNING_ENABLED } from '../../shared/config';
import { import {
approvalListTitle, approvalListTitle,
approvalListTitleForListId, approvalListTitleForListId,
@@ -179,7 +180,7 @@ const VacationView: React.FC<IVacationViewProps> = ({ context, itemId, formKey,
// заявка остаётся на согласовании, и ошибку видно в панели решения; согласовать можно ещё раз. // заявка остаётся на согласовании, и ошибку видно в панели решения; согласовать можно ещё раз.
const sendBeforeFinalApproval = async (decision: ApproverDecision): Promise<void> => { const sendBeforeFinalApproval = async (decision: ApproverDecision): Promise<void> => {
sentBeforeDecision.current = false; sentBeforeDecision.current = false;
if (decision !== 'approve') return; if (!VACATION_EDO_SIGNING_ENABLED || decision !== 'approve') return;
if (!completesApprovalPhase(status, await approval.getMatrixForRequest(itemId))) return; if (!completesApprovalPhase(status, await approval.getMatrixForRequest(itemId))) return;
@@ -235,6 +236,9 @@ const VacationView: React.FC<IVacationViewProps> = ({ context, itemId, formKey,
</div> </div>
<div className="rp-no-print"> <div className="rp-no-print">
{/* Пока отправка в ЭДО выключена — ни одного сообщения о ней. */}
{VACATION_EDO_SIGNING_ENABLED && (
<>
{signingBusy && <Alert variant="ok">Отправляем заявление на подпись в ЭДО…</Alert>} {signingBusy && <Alert variant="ok">Отправляем заявление на подпись в ЭДО…</Alert>}
{!signingBusy && signingResult && signingResult.skipped.length > 0 && ( {!signingBusy && signingResult && signingResult.skipped.length > 0 && (
<Alert variant="err"> <Alert variant="err">
@@ -249,6 +253,8 @@ const VacationView: React.FC<IVacationViewProps> = ({ context, itemId, formKey,
</Button> </Button>
</> </>
)} )}
</>
)}
<DecisionPanel <DecisionPanel
service={approverService} service={approverService}
requestId={itemId} requestId={itemId}
@@ -258,7 +264,7 @@ const VacationView: React.FC<IVacationViewProps> = ({ context, itemId, formKey,
setStatus(newStatus); setStatus(newStatus);
setDecisionSeq((n) => n + 1); setDecisionSeq((n) => n + 1);
notify(); notify();
return sentBeforeDecision.current ? 'Документы отправлены на подписание в ЭДО.' : undefined; return VACATION_EDO_SIGNING_ENABLED && sentBeforeDecision.current ?'Документы отправлены на подписание в ЭДО.' : undefined;
}} }}
onDelegated={() => { onDelegated={() => {
setDecisionSeq((n) => n + 1); setDecisionSeq((n) => n + 1);
@@ -81,6 +81,13 @@ export function getEdoApiBaseUrl(): string {
return _edoApiBaseUrl; return _edoApiBaseUrl;
} }
/**
* Отправка согласованного заявления на отпуск на подпись в ЭДО (forms/Vacation/VacationView).
* Временно выключена: решение последнего согласующего применяется без обращения к ЭДО.
* Чтобы вернуть — поставить true, остальной код отправки на месте.
*/
export const VACATION_EDO_SIGNING_ENABLED = false;
// Уведомления согласующим (поток Power Automate, см. approval/notify.service.ts). // Уведомления согласующим (поток Power Automate, см. approval/notify.service.ts).
// Настраивается свойствами веб-части notificationsEnabled / notifyOnlyTo — тот // Настраивается свойствами веб-части notificationsEnabled / notifyOnlyTo — тот
// же модульный синглтон, что и у approvalApiBaseUrl выше. // же модульный синглтон, что и у approvalApiBaseUrl выше.