收敛报销退回动作与审批布局 [09-04-approval-return-reject-actions]

这个提交包含在:
2026-09-04 10:31:32 +08:00
父节点 59df0594bb
当前提交 8551601818
共修改 17 个文件,包含 520 行新增和 56 行删除
+4 -1
查看文件
@@ -690,7 +690,10 @@ function listAllowedActionsForTask(request, task, actionable) {
const approvePermission = resolveEntityPermission(task.workflow_instance?.entity_type, "approve");
const canApprove = approvePermission && hasPermission(request.employee.permissionCodes, approvePermission);
if (canApprove) {
actions.push("approve", "reject");
actions.push("approve");
if (task.workflow_instance?.entity_type !== "reimbursement") {
actions.push("reject");
}
if (task.workflow_instance?.entity_type !== "attendance_correction") {
actions.push("return");
}
@@ -32,6 +32,19 @@ describe("Workflow Route Permissions", () => {
expect(actions).toEqual(["approve", "reject", "return"]);
});
it("exposes return instead of reject for reimbursement tasks", () => {
const actions = listAllowedActionsForTask(
{ employee: { permissionCodes: ["expense.approve"] } },
{
status: "pending",
workflow_instance: { entity_type: "reimbursement" },
},
true,
);
expect(actions).toEqual(["approve", "return"]);
});
it("does not allow expense approvers to act on leave tasks without leave.approve", () => {
const actions = listAllowedActionsForTask(
{ employee: { permissionCodes: ["expense.approve"] } },
@@ -117,11 +130,20 @@ describe("Workflow Route Permissions", () => {
},
true,
);
const attendanceActions = listAllowedActionsForTask(
{ employee: { permissionCodes: ["attendance.approve", "expense.transfer"] } },
{
status: "pending",
workflow_instance: { entity_type: "attendance_correction" },
},
true,
);
expect(reimbursementActions).toContain("transfer");
expect(leaveActions).toContain("transfer");
expect(purchaseActions).toContain("transfer");
expect(travelActions).toContain("transfer");
expect(reimbursementActions).toEqual(["approve", "return", "transfer"]);
expect(leaveActions).toEqual(["approve", "reject", "return", "transfer"]);
expect(purchaseActions).toEqual(["approve", "reject", "return", "transfer"]);
expect(travelActions).toEqual(["approve", "reject", "return", "transfer"]);
expect(attendanceActions).toEqual(["approve", "reject", "transfer"]);
});
it("does not allow transfer without matching approve permission", () => {