Compare commits
5 Commits
abe7cdbbc3
...
5f45b7da20
| Author | SHA1 | Date | |
|---|---|---|---|
| 5f45b7da20 | |||
| 04faca37ae | |||
| 7b4382370d | |||
| a3ffaf696a | |||
| 6217135629 |
@@ -3,7 +3,7 @@
|
||||
"solution": {
|
||||
"name": "ct-forms-portal-client-side-solution",
|
||||
"id": "a1c3b00d-3ac8-449a-ad9d-6d0d522df14f",
|
||||
"version": "1.0.0.0",
|
||||
"version": "1.0.0.2",
|
||||
"includeClientSideAssets": true,
|
||||
"skipFeatureDeployment": true,
|
||||
"isDomainIsolated": false,
|
||||
@@ -30,7 +30,7 @@
|
||||
"title": "ct-forms-portal Feature",
|
||||
"description": "The feature that activates elements of the ct-forms-portal solution.",
|
||||
"id": "5edbf144-12c3-4535-bb61-6417cdcc5f7d",
|
||||
"version": "1.0.0.0"
|
||||
"version": "1.0.0.2"
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
+11
-4
@@ -103,8 +103,6 @@ export function useStep3Approval(args: UseStep3ApprovalArgs) {
|
||||
: m,
|
||||
);
|
||||
onSave({ approvalChain: updatedChain });
|
||||
const nextPending = updatedChain.find((m) => m.status === "pending");
|
||||
if (nextPending?.spApprovalId) await notify(nextPending.spApprovalId);
|
||||
const allDone = updatedChain.every(
|
||||
(m) =>
|
||||
m.status === "approved" ||
|
||||
@@ -112,12 +110,19 @@ export function useStep3Approval(args: UseStep3ApprovalArgs) {
|
||||
m.status === "recommends",
|
||||
);
|
||||
if (allDone) {
|
||||
// Финал: статус «Согласовано» ДО оповещения, и шлём по currentMember (у него
|
||||
// spApprovalId точно есть) — иначе на финале «Согласована» не уходит, а поток
|
||||
// читает ещё «На согласовании». Порядок как в ветке отклонения / в Step4.
|
||||
await service.updateOIDStatus(oid.id, "approved");
|
||||
onSave({
|
||||
approvalChain: updatedChain,
|
||||
oid: { ...oid, status: "approved" },
|
||||
});
|
||||
if (currentMember.spApprovalId) await notify(currentMember.spApprovalId);
|
||||
onStepComplete(4);
|
||||
} else {
|
||||
const nextPending = updatedChain.find((m) => m.status === "pending");
|
||||
if (nextPending?.spApprovalId) await notify(nextPending.spApprovalId);
|
||||
}
|
||||
} else {
|
||||
const othersToDelete = approvalChain.filter(
|
||||
@@ -145,8 +150,10 @@ export function useStep3Approval(args: UseStep3ApprovalArgs) {
|
||||
approvalChain: finalChain,
|
||||
oid: { ...oid, status: "rejected" },
|
||||
});
|
||||
const initiator = finalChain.find((m) => m.role === "Инициатор");
|
||||
if (initiator?.spApprovalId) await notify(initiator.spApprovalId);
|
||||
// Шлём по отклонившему (currentMember) — у него spApprovalId гарантированно есть
|
||||
// (проверен в начале). У инициатора он мог отсутствовать после манипуляций с цепочкой,
|
||||
// из-за чего reject по Teams-ссылке вообще не дёргал поток.
|
||||
await notify(currentMember.spApprovalId);
|
||||
}
|
||||
setActionDialog(null);
|
||||
} catch (err) {
|
||||
|
||||
@@ -304,8 +304,11 @@ export function useStep4Approval(args: UseStep4ApprovalArgs) {
|
||||
approvalChain: finalChain,
|
||||
oid: { ...oid!, status: "rejected" },
|
||||
});
|
||||
const initiator = finalChain.find((m) => m.role === "Инициатор");
|
||||
if (initiator?.spApprovalId) await notify(initiator.spApprovalId);
|
||||
// Уведомляем по spId ОТКЛОНИВШЕГО (currentMember) — он гарантированно есть (проверен в
|
||||
// начале обработчика). У инициатора spApprovalId мог отсутствовать после манипуляций с
|
||||
// цепочкой, из-за чего reject вообще не дёргал поток. Ветку письма определяет статус СТ
|
||||
// («Отклонено»), получателя — автор СТ, поэтому чей элемент согласования передан — не важно.
|
||||
await notify(currentMember.spApprovalId);
|
||||
}
|
||||
|
||||
closeActionDialog();
|
||||
|
||||
Reference in New Issue
Block a user