2 Commits

Author SHA1 Message Date
gorbenko.pavel 093bbecd9f fix: в заявке на отпуск не показываются сообщения об отправке в ЭДО
Tests / frontend-test (push) Successful in 2m17s
Плашки об отправке, ошибке и повторе, а также текст «Документы
отправлены на подписание в ЭДО» показываются только при включённом
VACATION_EDO_SIGNING_ENABLED.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 16:38:17 +05:00
gorbenko.pavel 59b0fbc569 feat: временно выключена отправка заявления на отпуск в ЭДО
Флаг VACATION_EDO_SIGNING_ENABLED в shared/config.ts: пока false,
решение последнего согласующего применяется без обращения к ЭДО.
Код отправки оставлен, включается заменой флага на true.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 16:37:34 +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,18 +236,23 @@ const VacationView: React.FC<IVacationViewProps> = ({ context, itemId, formKey,
</div> </div>
<div className="rp-no-print"> <div className="rp-no-print">
{signingBusy && <Alert variant="ok">Отправляем заявление на подпись в ЭДО…</Alert>} {/* Пока отправка в ЭДО выключена — ни одного сообщения о ней. */}
{!signingBusy && signingResult && signingResult.skipped.length > 0 && ( {VACATION_EDO_SIGNING_ENABLED && (
<Alert variant="err">
{`Не отправлено по компаниям: ${signingResult.skipped.map((c) => `${c.name} — ${c.reason}`).join('; ')}.`}
</Alert>
)}
{!signingBusy && signingError && (
<> <>
<Alert variant="err">{signingError}</Alert> {signingBusy && <Alert variant="ok">Отправляем заявление на подпись в ЭДО…</Alert>}
<Button variant="secondary" onClick={retrySigning}> {!signingBusy && signingResult && signingResult.skipped.length > 0 && (
Повторить отправку на подпись <Alert variant="err">
</Button> {`Не отправлено по компаниям: ${signingResult.skipped.map((c) => `${c.name} — ${c.reason}`).join('; ')}.`}
</Alert>
)}
{!signingBusy && signingError && (
<>
<Alert variant="err">{signingError}</Alert>
<Button variant="secondary" onClick={retrySigning}>
Повторить отправку на подпись
</Button>
</>
)}
</> </>
)} )}
<DecisionPanel <DecisionPanel
@@ -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 выше.