Compare commits

...

5 Commits

Author SHA1 Message Date
Тимур Городецкий 5f45b7da20 fix(oid): оповещение об отклонении/согласовании (Step3 Teams-ссылка и Step4)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-09-04 11:13:50 +05:00
Тимур Городецкий 04faca37ae Revert "fix(oid): передаём статус СТ в поток оповещения (не читаем из SP)"
This reverts commit a3ffaf696a.
2026-09-04 09:55:39 +05:00
Тимур Городецкий 7b4382370d chore: версия 1.0.0.2
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-09-04 09:49:53 +05:00
Тимур Городецкий a3ffaf696a fix(oid): передаём статус СТ в поток оповещения (не читаем из SP)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-09-04 09:49:26 +05:00
Тимур Городецкий 6217135629 chore: поднять версию решения до 1.0.0.1 для деплоя правок
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-09-03 17:59:43 +05:00
3 changed files with 18 additions and 8 deletions
+2 -2
View File
@@ -3,7 +3,7 @@
"solution": { "solution": {
"name": "ct-forms-portal-client-side-solution", "name": "ct-forms-portal-client-side-solution",
"id": "a1c3b00d-3ac8-449a-ad9d-6d0d522df14f", "id": "a1c3b00d-3ac8-449a-ad9d-6d0d522df14f",
"version": "1.0.0.0", "version": "1.0.0.2",
"includeClientSideAssets": true, "includeClientSideAssets": true,
"skipFeatureDeployment": true, "skipFeatureDeployment": true,
"isDomainIsolated": false, "isDomainIsolated": false,
@@ -30,7 +30,7 @@
"title": "ct-forms-portal Feature", "title": "ct-forms-portal Feature",
"description": "The feature that activates elements of the ct-forms-portal solution.", "description": "The feature that activates elements of the ct-forms-portal solution.",
"id": "5edbf144-12c3-4535-bb61-6417cdcc5f7d", "id": "5edbf144-12c3-4535-bb61-6417cdcc5f7d",
"version": "1.0.0.0" "version": "1.0.0.2"
} }
] ]
}, },
@@ -103,8 +103,6 @@ export function useStep3Approval(args: UseStep3ApprovalArgs) {
: m, : m,
); );
onSave({ approvalChain: updatedChain }); onSave({ approvalChain: updatedChain });
const nextPending = updatedChain.find((m) => m.status === "pending");
if (nextPending?.spApprovalId) await notify(nextPending.spApprovalId);
const allDone = updatedChain.every( const allDone = updatedChain.every(
(m) => (m) =>
m.status === "approved" || m.status === "approved" ||
@@ -112,12 +110,19 @@ export function useStep3Approval(args: UseStep3ApprovalArgs) {
m.status === "recommends", m.status === "recommends",
); );
if (allDone) { if (allDone) {
// Финал: статус «Согласовано» ДО оповещения, и шлём по currentMember (у него
// spApprovalId точно есть) — иначе на финале «Согласована» не уходит, а поток
// читает ещё «На согласовании». Порядок как в ветке отклонения / в Step4.
await service.updateOIDStatus(oid.id, "approved"); await service.updateOIDStatus(oid.id, "approved");
onSave({ onSave({
approvalChain: updatedChain, approvalChain: updatedChain,
oid: { ...oid, status: "approved" }, oid: { ...oid, status: "approved" },
}); });
if (currentMember.spApprovalId) await notify(currentMember.spApprovalId);
onStepComplete(4); onStepComplete(4);
} else {
const nextPending = updatedChain.find((m) => m.status === "pending");
if (nextPending?.spApprovalId) await notify(nextPending.spApprovalId);
} }
} else { } else {
const othersToDelete = approvalChain.filter( const othersToDelete = approvalChain.filter(
@@ -145,8 +150,10 @@ export function useStep3Approval(args: UseStep3ApprovalArgs) {
approvalChain: finalChain, approvalChain: finalChain,
oid: { ...oid, status: "rejected" }, oid: { ...oid, status: "rejected" },
}); });
const initiator = finalChain.find((m) => m.role === "Инициатор"); // Шлём по отклонившему (currentMember) — у него spApprovalId гарантированно есть
if (initiator?.spApprovalId) await notify(initiator.spApprovalId); // (проверен в начале). У инициатора он мог отсутствовать после манипуляций с цепочкой,
// из-за чего reject по Teams-ссылке вообще не дёргал поток.
await notify(currentMember.spApprovalId);
} }
setActionDialog(null); setActionDialog(null);
} catch (err) { } catch (err) {
@@ -304,8 +304,11 @@ export function useStep4Approval(args: UseStep4ApprovalArgs) {
approvalChain: finalChain, approvalChain: finalChain,
oid: { ...oid!, status: "rejected" }, oid: { ...oid!, status: "rejected" },
}); });
const initiator = finalChain.find((m) => m.role === "Инициатор"); // Уведомляем по spId ОТКЛОНИВШЕГО (currentMember) — он гарантированно есть (проверен в
if (initiator?.spApprovalId) await notify(initiator.spApprovalId); // начале обработчика). У инициатора spApprovalId мог отсутствовать после манипуляций с
// цепочкой, из-за чего reject вообще не дёргал поток. Ветку письма определяет статус СТ
// («Отклонено»), получателя — автор СТ, поэтому чей элемент согласования передан — не важно.
await notify(currentMember.spApprovalId);
} }
closeActionDialog(); closeActionDialog();