From d3093aead7fae7726c3102236fbd40b4df11d8f9 Mon Sep 17 00:00:00 2001 From: WuYongJie Date: Sat, 6 Jun 2026 09:09:31 +0800 Subject: [PATCH] fix(intake): allow assigned purchaser pricing push --- .../NonIntegratedDetailClient.test.tsx | 75 +++++++++++++++++++ .../NonIntegratedDetailClient.tsx | 14 +++- .../src/lib/non-integrated-permissions.ts | 7 ++ 3 files changed, 95 insertions(+), 1 deletion(-) diff --git a/furniture-3d-system/src/app/intake/non-integrated/NonIntegratedDetailClient.test.tsx b/furniture-3d-system/src/app/intake/non-integrated/NonIntegratedDetailClient.test.tsx index f0660431..7273320d 100644 --- a/furniture-3d-system/src/app/intake/non-integrated/NonIntegratedDetailClient.test.tsx +++ b/furniture-3d-system/src/app/intake/non-integrated/NonIntegratedDetailClient.test.tsx @@ -6567,6 +6567,81 @@ describe("NonIntegratedDetailClient", () => { expect(costPriceInput).toHaveValue(""); }); + it("lets the assigned purchaser use product pricing push controls", async () => { + const actor = userEvent.setup(); + + saveNonIntegratedProduct( + createProductRecord({ + id: "DNZ0001-product-pricing-assigned-purchaser", + skuBatchConfirmedAt: CONFIRMED_SKU_BATCH_AT, + purchaser: "采购同事", + purchaseOwner: "采购同事", + skuItems: [ + createSkuItem({ + id: "sku-pricing-assigned-purchaser-1", + model: "SZ0230K01", + skuCode: "SZ023001", + barcode: "SZ023001N1280V01", + setCount: "1", + specName: "款式一 140/60/75", + manufacturer: "兰考华兰家具", + }), + ], + factoryRows: [ + { + skuId: "sku-pricing-assigned-purchaser-1", + confirmed: true, + model: "SZ0230K01", + skuCode: "SZ023001", + setCount: "1", + barcode: "SZ023001N1280V01", + specName: "款式一 140/60/75", + size: "140/60/75", + color: "胡桃色", + material: "橡胶木", + installMethod: "整装", + supplierName: "兰考华兰家具", + supplierCode: "N1280", + warehouse: "", + shippingMethod: "", + minimumOrderQuantity: "", + leadTime: "", + assemblyMode: "", + productionType: "", + installationService: "", + supplierCategory: "", + purchaseOrderMethod: "", + executeStandard: "GB/T3324-2024", + }, + ], + }), + ); + + render( + , + ); + + expect(screen.getByTestId("product-pricing-workspace")).toBeInTheDocument(); + const costPriceInput = screen.getByPlaceholderText("0"); + expect(costPriceInput).not.toHaveAttribute("readonly"); + expect(screen.getByRole("button", { name: "确认推送" })).toBeDisabled(); + + await actor.type(costPriceInput, "88"); + + expect(screen.getByRole("button", { name: "确认推送" })).toBeEnabled(); + expect(screen.getByRole("button", { name: "批量确认推送" })).toBeEnabled(); + }); + it("lets only admins reopen confirmed product factory rows before sample measurement is approved", async () => { const actor = userEvent.setup(); const productId = "DNZ0001-product-factory-reopen"; diff --git a/furniture-3d-system/src/app/intake/non-integrated/NonIntegratedDetailClient.tsx b/furniture-3d-system/src/app/intake/non-integrated/NonIntegratedDetailClient.tsx index e1ec7db0..e7fc192c 100644 --- a/furniture-3d-system/src/app/intake/non-integrated/NonIntegratedDetailClient.tsx +++ b/furniture-3d-system/src/app/intake/non-integrated/NonIntegratedDetailClient.tsx @@ -13087,8 +13087,15 @@ export default function NonIntegratedDetailClient({ isIntakeNonIntegratedPricingGroupUser(currentPermissionUser); const isCurrentUserSupplyChainQualityGroup = isIntakeNonIntegratedQualityGroupUser(currentPermissionUser); + const isCurrentUserProductPricingPurchaseOwner = + isCurrentUserNonIntegratedPurchaseOwner( + currentPermissionProduct, + currentPermissionUser, + ); const canUseProductPricingPushControls = - isCurrentUserAdmin || isCurrentUserSupplyChainPricingGroup; + isCurrentUserAdmin || + isCurrentUserSupplyChainPricingGroup || + isCurrentUserProductPricingPurchaseOwner; const isCurrentUserPurchaseDownloadRestricted = hasCurrentUserContext && !isCurrentUserFullDetailEditor && @@ -13607,6 +13614,10 @@ export default function NonIntegratedDetailClient({ activePermissionWorkspaceCategory === PLANNING_LAYOUT_WORKSPACE_CATEGORY; const activeWorkspaceNodePermissionAccess = getNodePermissionAccessForCategory(activePermissionWorkspaceCategory); + const canAssignedPurchaserEditProductPricingWorkspace = + stockProductCanEditActiveWorkspace && + activePermissionWorkspaceCategory === PRODUCT_PRICING_WORKSPACE_CATEGORY && + isCurrentUserProductPricingPurchaseOwner; const canEditCurrentProduct = mode === "create" ? !hasCurrentUserContext || @@ -13621,6 +13632,7 @@ export default function NonIntegratedDetailClient({ !hasCurrentUserContext || isCurrentUserAdmin || isCurrentUserFullDetailEditor || + canAssignedPurchaserEditProductPricingWorkspace || (mode === "create" ? canEditCurrentProduct : stockProductCanEditActiveWorkspace && diff --git a/furniture-3d-system/src/lib/non-integrated-permissions.ts b/furniture-3d-system/src/lib/non-integrated-permissions.ts index 90f93fc1..0a9a454a 100644 --- a/furniture-3d-system/src/lib/non-integrated-permissions.ts +++ b/furniture-3d-system/src/lib/non-integrated-permissions.ts @@ -478,6 +478,13 @@ export function canEditNonIntegratedWorkspace( return true } + if ( + normalizedCategory === PRODUCT_PRICING_WORKSPACE_CATEGORY && + isCurrentUserNonIntegratedPurchaseOwner(product, user) + ) { + return true + } + if ( PRICING_GROUP_WORKSPACE_CATEGORIES.has(normalizedCategory) && isIntakeNonIntegratedPricingGroupUser(user)