From 7bc33371b16ab905bd1a10cdc6807737b633686e Mon Sep 17 00:00:00 2001 From: ventselartur Date: Tue, 23 Jun 2026 20:49:34 +0200 Subject: [PATCH] Fix Bug 638815: Subcontracting: No validation of blank Subc. Location Code for WIP transfers at any stage --- .../Transfer/SubcCreateTransfOrder.Report.al | 2 +- .../Tests/SubcWIPTransCreateTest.Codeunit.al | 61 +++++++++++++++++++ 2 files changed, 62 insertions(+), 1 deletion(-) diff --git a/src/Apps/W1/Subcontracting/App/src/Transfer/SubcCreateTransfOrder.Report.al b/src/Apps/W1/Subcontracting/App/src/Transfer/SubcCreateTransfOrder.Report.al index fbb1153062..6ae9dc999f 100644 --- a/src/Apps/W1/Subcontracting/App/src/Transfer/SubcCreateTransfOrder.Report.al +++ b/src/Apps/W1/Subcontracting/App/src/Transfer/SubcCreateTransfOrder.Report.al @@ -558,7 +558,7 @@ report 99001501 "Subc. Create Transf. Order" GetTransferToLocationCodeForPurchaseHeader(PurchaseHeader, VendorFromPurchOrder, TransferToLocationCode); if TransferToLocationCode = '' then - exit(false); + VendorFromPurchOrder.TestField("Subc. Location Code"); PostedWIPQtyBase := GetWIPQtyBase(PurchaseLine, TransferToLocationCode); diff --git a/src/Apps/W1/Subcontracting/Test/Tests/SubcWIPTransCreateTest.Codeunit.al b/src/Apps/W1/Subcontracting/Test/Tests/SubcWIPTransCreateTest.Codeunit.al index a0e1b6dbef..b24780c1e5 100644 --- a/src/Apps/W1/Subcontracting/Test/Tests/SubcWIPTransCreateTest.Codeunit.al +++ b/src/Apps/W1/Subcontracting/Test/Tests/SubcWIPTransCreateTest.Codeunit.al @@ -1467,6 +1467,67 @@ codeunit 149911 "Subc. WIP Trans. Create Test" 'WIP Transfer Line description must not be cleared when Direct Transfer is enabled on the header.'); end; + [Test] + [HandlerFunctions('DoNotConfirmShowCreatedPurchOrderForSubcontracting')] + procedure WIPTransferCreationFailsWithTestFieldErrorWhenSubcLocationBlank() + var + Item: Record Item; + MachineCenter: array[2] of Record "Machine Center"; + ProductionOrder: Record "Production Order"; + PurchaseHeader: Record "Purchase Header"; + PurchaseLine: Record "Purchase Line"; + Vendor: Record Vendor; + WorkCenter: array[2] of Record "Work Center"; + PurchaseHeaderPage: TestPage "Purchase Order"; + begin + // [FEATURE] WIP Item Transfer for Subcontracting + // [SCENARIO 638815] When both the Vendor "Subc. Location Code" and the Purchase Header + // "Subc. Location Code" are blank, creating a WIP Transfer Order must raise a TestField + // error on Vendor "Subc. Location Code" instead of the generic "Nothing to create" error. + + // [GIVEN] Complete subcontracting setup with Transfer WIP Item = true on the routing line + Initialize(); + + // [GIVEN] Work centers, machine centers, item with routing + BOM + SubcWarehouseLibrary.CreateAndCalculateNeededWorkAndMachineCenter(WorkCenter, MachineCenter, true); + SubcWarehouseLibrary.CreateItemForProductionIncludeRoutingAndProdBOM(Item, WorkCenter, MachineCenter); + SetTransferWIPItemOnRoutingLine(Item."Routing No.", WorkCenter[2]."No.", true); + + // [GIVEN] Create and refresh released production order at the components location + LibraryManufacturing.CreateProductionOrder( + ProductionOrder, "Production Order Status"::Released, + ProductionOrder."Source Type"::Item, Item."No.", LibraryRandom.RandInt(10) + 5); + SetProdOrderLocationToCompSetupLocationAndRefresh(ProductionOrder); + + // [GIVEN] Create Subcontracting Purchase Order from Prod. Order Routing + // (vendor already has a Subc. Location Code from CreateAndCalculateNeededWorkAndMachineCenter, + // so the purchase header inherits it; we will clear both afterwards) + SubcontractingMgmtLibrary.CreateSubcontractingOrderFromProdOrderRtngPage(Item."Routing No.", WorkCenter[2]."No."); + + PurchaseLine.SetRange("Document Type", PurchaseLine."Document Type"::Order); + PurchaseLine.SetRange("Prod. Order No.", ProductionOrder."No."); + PurchaseLine.FindFirst(); + PurchaseHeader.Get(PurchaseLine."Document Type", PurchaseLine."Document No."); + + // [GIVEN] Both the Vendor "Subc. Location Code" and the Purchase Header "Subc. Location Code" are cleared + Vendor.Get(WorkCenter[2]."Subcontractor No."); + Vendor."Subc. Location Code" := ''; + Vendor.Modify(); + + PurchaseHeader."Subc. Location Code" := ''; + PurchaseHeader.Modify(); + + // [WHEN] Attempting to create a Transfer Order to the Subcontractor + PurchaseHeaderPage.OpenView(); + PurchaseHeaderPage.GoToRecord(PurchaseHeader); + asserterror PurchaseHeaderPage.CreateTransfOrdToSubcontractor.Invoke(); + + // [THEN] A targeted TestField error on "Subc. Location Code" is raised + // (not the generic "Nothing to create" error — that is the current, unfixed behaviour) + Assert.ExpectedErrorCode('TestField'); + Assert.ExpectedError('Subcontracting Location Code'); + end; + [PageHandler] procedure HandleTransferOrder(var TransfOrderPage: TestPage "Transfer Order") begin