Compare commits
5 Commits
abe7cdbbc3
...
5f45b7da20
| Author | SHA1 | Date | |
|---|---|---|---|
| 5f45b7da20 | |||
| 04faca37ae | |||
| 7b4382370d | |||
| a3ffaf696a | |||
| 6217135629 |
@@ -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"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|||||||
+11
-4
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user