diff --git a/src/webparts/ctFormsPortal/forms/ct/components/Step4Approval/Step4Approval.tsx b/src/webparts/ctFormsPortal/forms/ct/components/Step4Approval/Step4Approval.tsx index 925d031..18784d8 100644 --- a/src/webparts/ctFormsPortal/forms/ct/components/Step4Approval/Step4Approval.tsx +++ b/src/webparts/ctFormsPortal/forms/ct/components/Step4Approval/Step4Approval.tsx @@ -67,7 +67,6 @@ export const Step4Approval: React.FC = (props) => { )} {a.ct?.status === "on_approval" && СТ находится на согласовании.} - {a.notifyWarning && {a.notifyWarning}} {/* Approval chain */}
diff --git a/src/webparts/ctFormsPortal/forms/ct/components/Step4Approval/useStep4Approval.ts b/src/webparts/ctFormsPortal/forms/ct/components/Step4Approval/useStep4Approval.ts index 1714f0f..7cb8806 100644 --- a/src/webparts/ctFormsPortal/forms/ct/components/Step4Approval/useStep4Approval.ts +++ b/src/webparts/ctFormsPortal/forms/ct/components/Step4Approval/useStep4Approval.ts @@ -49,7 +49,6 @@ export function useStep4Approval(args: UseStep4ApprovalArgs) { const [actionDialog, setActionDialog] = useState(null); const [isSubmitting, setIsSubmitting] = useState(false); const [submitError, setSubmitError] = useState(null); - const [notifyWarning, setNotifyWarning] = useState(null); const [isSendingToIncore, setIsSendingToIncore] = useState(false); const [incoreStep, setIncoreStep] = useState(null); const [incoreError, setIncoreError] = useState(null); @@ -236,8 +235,9 @@ export function useStep4Approval(args: UseStep4ApprovalArgs) { try { await service.triggerApprovalNotification(spId); } catch (e) { + // Оповещение — best-effort: поток может ответить с таймаутом (504), хотя сообщение + // уже ушло. Не пугаем пользователя ложной плашкой, только логируем для отладки. console.error('[Step4] triggerApprovalNotification failed for spId', spId, e); - setNotifyWarning('Голос записан, но уведомление в Teams не удалось отправить. Проверьте Power Automate.'); } }; @@ -250,6 +250,18 @@ export function useStep4Approval(args: UseStep4ApprovalArgs) { setChain(updatedChain); onSave({ approvalChain: updatedChain }); + const allApproved = updatedChain.every( + (m) => m.status === 'approved' || m.status === 'skipped' || m.status === 'recommends', + ); + + // Финальное согласование: сначала переводим СТ в «Согласовано», и только ПОТОМ + // шлём оповещение. Иначе поток прочитает статус ещё «На согласовании» и отправит + // не то письмо. Порядок как в ветке отклонения (сначала статус, затем notify). + if (allApproved) { + await service.updateCTStatus(ct!.id, 'approved'); + onSave({ ct: { ...ct!, status: 'approved' } }); + } + if (currentMember?.spApprovalId) { await notify(currentMember.spApprovalId); } @@ -259,12 +271,7 @@ export function useStep4Approval(args: UseStep4ApprovalArgs) { await notify(nextPending.spApprovalId); } - const allApproved = updatedChain.every( - (m) => m.status === 'approved' || m.status === 'skipped' || m.status === 'recommends', - ); if (allApproved) { - await service.updateCTStatus(ct!.id, 'approved'); - onSave({ ct: { ...ct!, status: 'approved' } }); onStepComplete(4); } } else { @@ -321,8 +328,8 @@ export function useStep4Approval(args: UseStep4ApprovalArgs) { try { await service.triggerApprovalNotification(firstApprover.spApprovalId); } catch (e) { + // best-effort (см. notify выше) — ложную плашку не показываем. console.error('[Step4] triggerApprovalNotification (send) failed for spId', firstApprover.spApprovalId, e); - setNotifyWarning('СТ отправлена на согласование, но уведомление в Teams не удалось отправить. Проверьте Power Automate.'); } } @@ -432,8 +439,6 @@ export function useStep4Approval(args: UseStep4ApprovalArgs) { ct, chain, submitError, - notifyWarning, - dismissNotifyWarning: () => setNotifyWarning(null), isSubmitting, isSendingToIncore, incoreStep,