收紧付款复核资料与阶段编辑(08-01-reimbursement-notification-progress-clarity)
这个提交包含在:
@@ -124,7 +124,7 @@ function reimbursementDetail() {
|
||||
};
|
||||
}
|
||||
|
||||
function paymentBatch(status: "draft" | "reviewed" = "reviewed", highRisk = false) {
|
||||
function paymentBatch(status: "draft" | "reviewed" | "executed" | "cancelled" = "reviewed", highRisk = false) {
|
||||
return {
|
||||
id: paymentBatchId,
|
||||
batchNo: "PAY-ACTION-001",
|
||||
@@ -169,10 +169,12 @@ function paymentBatch(status: "draft" | "reviewed" = "reviewed", highRisk = fals
|
||||
paymentVoucherNoOverride: null,
|
||||
paymentDateOverride: null,
|
||||
paymentChannelOverride: null,
|
||||
payeeName: "合成收款员工",
|
||||
bankName: "合成银行",
|
||||
bankAccountMasked: "6222********5678",
|
||||
status: "pending",
|
||||
failureCode: null,
|
||||
failureMessage: null,
|
||||
snapshotJson: {},
|
||||
createdAt: "2026-05-15T08:00:00.000Z",
|
||||
openRiskFlags: [],
|
||||
},
|
||||
@@ -183,7 +185,7 @@ function paymentBatch(status: "draft" | "reviewed" = "reviewed", highRisk = fals
|
||||
async function mockSystemActionApis(
|
||||
page: Page,
|
||||
options: {
|
||||
batchStatus?: "draft" | "reviewed";
|
||||
batchStatus?: "draft" | "reviewed" | "executed" | "cancelled";
|
||||
hasReceipt?: boolean;
|
||||
receiptQueryError?: boolean;
|
||||
highRisk?: boolean;
|
||||
@@ -198,6 +200,7 @@ async function mockSystemActionApis(
|
||||
deleteReimbursementAttachment: 0,
|
||||
exportReimbursements: 0,
|
||||
executePaymentBatch: 0,
|
||||
paymentBatchDetail: 0,
|
||||
uploadPaymentReceipt: 0,
|
||||
voidPaymentReceipt: 0,
|
||||
attachmentDeleteReasons: [] as string[],
|
||||
@@ -330,7 +333,24 @@ async function mockSystemActionApis(
|
||||
}
|
||||
|
||||
if (path === "/api/payment-batches" && request.method() === "GET") {
|
||||
await fulfillJson(route, { items: [paymentBatch(batchStatus, options.highRisk)] });
|
||||
const listItem = paymentBatch(batchStatus, options.highRisk);
|
||||
await fulfillJson(route, {
|
||||
items: [{
|
||||
...listItem,
|
||||
items: listItem.items.map((item) => ({
|
||||
...item,
|
||||
payeeName: null,
|
||||
bankName: null,
|
||||
bankAccountMasked: null,
|
||||
})),
|
||||
}],
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
if (path === `/api/payment-batches/${paymentBatchId}` && request.method() === "GET") {
|
||||
calls.paymentBatchDetail += 1;
|
||||
await fulfillJson(route, { item: paymentBatch(batchStatus, options.highRisk) });
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -502,6 +522,34 @@ test.describe("R7E 全站高风险操作二次确认", () => {
|
||||
await expect(page.getByTestId("payment-batch-current-processing")).toContainText("线下付款并上传银行回单");
|
||||
});
|
||||
|
||||
test("付款详情按批次状态渐进展示收款依据和财务动作", async ({ page }) => {
|
||||
const calls = await mockSystemActionApis(page, { batchStatus: "draft", hasReceipt: true });
|
||||
await login(page, user);
|
||||
await page.goto(`/payment-batches?id=${paymentBatchId}`);
|
||||
|
||||
const draftItems = page.getByTestId("payment-batch-items-panel");
|
||||
await expect.poll(() => calls.paymentBatchDetail).toBe(1);
|
||||
await expect(draftItems).toContainText("合成收款员工");
|
||||
await expect(draftItems).toContainText("合成银行");
|
||||
await expect(draftItems).toContainText("6222********5678");
|
||||
await expect(draftItems).toContainText("银行转账");
|
||||
await expect(draftItems.getByTestId("payment-batch-item-payment-fields")).toHaveCount(0);
|
||||
await expect(page.getByTestId("payment-batch-receipt-file-input")).toHaveCount(0);
|
||||
await expect(page.getByRole("button", { name: "上传银行回单" })).toHaveCount(0);
|
||||
await expect(page.getByRole("button", { name: "作废" })).toHaveCount(0);
|
||||
|
||||
await page.unrouteAll({ behavior: "wait" });
|
||||
await mockSystemActionApis(page, { batchStatus: "executed", hasReceipt: true });
|
||||
await page.reload();
|
||||
|
||||
await expect(page.getByTestId("payment-batch-item-payment-fields")).toHaveCount(0);
|
||||
await expect(page.getByTestId("payment-batch-item-payment-readonly")).toBeVisible();
|
||||
await expect(page.getByTestId("payment-batch-receipt-file-input")).toHaveCount(0);
|
||||
await expect(page.getByRole("button", { name: "上传银行回单" })).toHaveCount(0);
|
||||
await expect(page.getByRole("button", { name: "作废" })).toHaveCount(0);
|
||||
await expect(page.getByRole("button", { name: "下载" })).toBeVisible();
|
||||
});
|
||||
|
||||
test("高敏附件删除要求对象、后果和理由,取消与理由不足均为零请求", async ({ page }) => {
|
||||
const calls = await mockSystemActionApis(page);
|
||||
await login(page, user);
|
||||
|
||||
在新工单中引用
屏蔽一个用户