diff --git a/src/Apps/W1/Subcontracting/App/src/Manufacturing/SubcProdOrderRtng.PageExt.al b/src/Apps/W1/Subcontracting/App/src/Manufacturing/SubcProdOrderRtng.PageExt.al index b74bb028dc3..0f01810522f 100644 --- a/src/Apps/W1/Subcontracting/App/src/Manufacturing/SubcProdOrderRtng.PageExt.al +++ b/src/Apps/W1/Subcontracting/App/src/Manufacturing/SubcProdOrderRtng.PageExt.al @@ -195,7 +195,7 @@ pageextension 99001503 "Subc. Prod. Order Rtng." extends "Prod. Order Routing" local procedure UpdateWIPEnabled() begin Rec.Calcfields(Subcontracting); - TransferWIPItemEnabled := Rec.Subcontracting; + TransferWIPItemEnabled := Rec.Subcontracting and (Rec.Type = Rec.Type::"Work Center"); end; internal procedure CreateSubcontractingOrders(var ProdOrderRoutingLine: Record "Prod. Order Routing Line") diff --git a/src/Apps/W1/Subcontracting/App/src/Manufacturing/SubcProdOrderRtngLineExt.TableExt.al b/src/Apps/W1/Subcontracting/App/src/Manufacturing/SubcProdOrderRtngLineExt.TableExt.al index 6dbeadfd5c4..05e7ee0840c 100644 --- a/src/Apps/W1/Subcontracting/App/src/Manufacturing/SubcProdOrderRtngLineExt.TableExt.al +++ b/src/Apps/W1/Subcontracting/App/src/Manufacturing/SubcProdOrderRtngLineExt.TableExt.al @@ -102,6 +102,7 @@ tableextension 99001506 "Subc. ProdOrderRtngLine Ext." extends "Prod. Order Rout if "Transfer WIP Item" then begin CalcFields(Subcontracting); TestField(Subcontracting, true); + TestField(Type, Type::"Work Center"); end; end; } diff --git a/src/Apps/W1/Subcontracting/App/src/Manufacturing/SubcRoutingLine.TableExt.al b/src/Apps/W1/Subcontracting/App/src/Manufacturing/SubcRoutingLine.TableExt.al index 0f79bb81f61..27b91337519 100644 --- a/src/Apps/W1/Subcontracting/App/src/Manufacturing/SubcRoutingLine.TableExt.al +++ b/src/Apps/W1/Subcontracting/App/src/Manufacturing/SubcRoutingLine.TableExt.al @@ -99,6 +99,7 @@ tableextension 99001560 "Subc. Routing Line" extends "Routing Line" if "Transfer WIP Item" then begin CalcFields(Subcontracting); TestField(Subcontracting, true); + TestField(Type, Type::"Work Center"); end; end; } diff --git a/src/Apps/W1/Subcontracting/App/src/Manufacturing/SubcRoutingLines.PageExt.al b/src/Apps/W1/Subcontracting/App/src/Manufacturing/SubcRoutingLines.PageExt.al index 62da5b63a9f..ad67527337d 100644 --- a/src/Apps/W1/Subcontracting/App/src/Manufacturing/SubcRoutingLines.PageExt.al +++ b/src/Apps/W1/Subcontracting/App/src/Manufacturing/SubcRoutingLines.PageExt.al @@ -112,7 +112,7 @@ pageextension 99001508 "Subc. Routing Lines" extends "Routing Lines" local procedure UpdateWIPEnabled() begin Rec.Calcfields(Subcontracting); - TransferWIPItemEnabled := Rec.Subcontracting; + TransferWIPItemEnabled := Rec.Subcontracting and (Rec.Type = Rec.Type::"Work Center"); end; procedure ShowRelatedSubcontractorPrices() diff --git a/src/Apps/W1/Subcontracting/App/src/Manufacturing/SubcRoutingVersionLines.PageExt.al b/src/Apps/W1/Subcontracting/App/src/Manufacturing/SubcRoutingVersionLines.PageExt.al index 88ed221f0f0..0e5cc67c4f9 100644 --- a/src/Apps/W1/Subcontracting/App/src/Manufacturing/SubcRoutingVersionLines.PageExt.al +++ b/src/Apps/W1/Subcontracting/App/src/Manufacturing/SubcRoutingVersionLines.PageExt.al @@ -106,7 +106,7 @@ pageextension 99001509 "Subc. Routing Version Lines" extends "Routing Version Li local procedure UpdateWIPEnabled() begin Rec.Calcfields(Subcontracting); - TransferWIPItemEnabled := Rec.Subcontracting; + TransferWIPItemEnabled := Rec.Subcontracting and (Rec.Type = Rec.Type::"Work Center"); end; procedure ShowRelatedSubcontractorPrices() diff --git a/src/Apps/W1/Subcontracting/App/src/Purchase/SubcPOSubform.PageExt.al b/src/Apps/W1/Subcontracting/App/src/Purchase/SubcPOSubform.PageExt.al index 10d12ef3502..c45c9e6f847 100644 --- a/src/Apps/W1/Subcontracting/App/src/Purchase/SubcPOSubform.PageExt.al +++ b/src/Apps/W1/Subcontracting/App/src/Purchase/SubcPOSubform.PageExt.al @@ -16,6 +16,7 @@ pageextension 99001524 "Subc. PO Subform" extends "Purchase Order Subform" { ApplicationArea = Subcontracting; Visible = false; + Editable = false; } } } diff --git a/src/Apps/W1/Subcontracting/Test/Libraries/SubcLibraryMfgManagement.Codeunit.al b/src/Apps/W1/Subcontracting/Test/Libraries/SubcLibraryMfgManagement.Codeunit.al index 3d1ef6a33b1..46ec5c5d0cf 100644 --- a/src/Apps/W1/Subcontracting/Test/Libraries/SubcLibraryMfgManagement.Codeunit.al +++ b/src/Apps/W1/Subcontracting/Test/Libraries/SubcLibraryMfgManagement.Codeunit.al @@ -124,6 +124,12 @@ codeunit 139984 "Subc. Library Mfg. Management" MachineCenterNo := MachineCenter."No."; end; + procedure CreateRoutingLineForMachineCenter(var RoutingLine: Record "Routing Line"; RoutingHeader: Record "Routing Header"; MachineCenterNo: Code[20]) + begin + RoutingLine.Type := RoutingLine.Type::"Machine Center"; + CreateRoutingLine(RoutingLine, RoutingHeader, MachineCenterNo); + end; + procedure CreateRouting(var RoutingNo: Code[20]; MachineCenterNo: Code[20]; MachineCenterNo2: Code[20]; WorkCenterNo: Code[20]; WorkCenterNo2: Code[20]) var RoutingHeader: Record "Routing Header"; @@ -143,7 +149,7 @@ codeunit 139984 "Subc. Library Mfg. Management" RoutingNo := RoutingHeader."No."; end; - local procedure CreateRoutingLine(var RoutingLine: Record "Routing Line"; RoutingHeader: Record "Routing Header"; CenterNo: Code[20]) + procedure CreateRoutingLine(var RoutingLine: Record "Routing Line"; RoutingHeader: Record "Routing Header"; CenterNo: Code[20]) var CapacityUnitOfMeasure: Record "Capacity Unit of Measure"; OperationNo: Code[10]; diff --git a/src/Apps/W1/Subcontracting/Test/Tests/SubcSubcontractingUITest.Codeunit.al b/src/Apps/W1/Subcontracting/Test/Tests/SubcSubcontractingUITest.Codeunit.al index 49163dd0407..3ab829e991a 100644 --- a/src/Apps/W1/Subcontracting/Test/Tests/SubcSubcontractingUITest.Codeunit.al +++ b/src/Apps/W1/Subcontracting/Test/Tests/SubcSubcontractingUITest.Codeunit.al @@ -80,11 +80,11 @@ codeunit 139990 "Subc. Subcontracting UI Test" procedure SubcontractingSetupWizardShowsCompanyDefaultsAndConfigurationLinks() var ManufacturingSetup: Record "Manufacturing Setup"; + SubcCompTransferLeadTime: DateFormula; SubcontractingSetupWizard: TestPage "Subcontracting Setup Wizard"; ComponentDirectUnitCost: Option Standard,"Prod. Order Component"; CreateProdOrderInfoLine: Boolean; SubcDefaultCompLocation: Enum "Components at Location"; - SubcCompTransferLeadTime: DateFormula; SubcontractingBatchName: Code[10]; SubcontractingTemplateName: Code[10]; begin @@ -1014,6 +1014,228 @@ codeunit 139990 "Subc. Subcontracting UI Test" ItemLedgerEntry.Delete(); end; + [Test] + procedure RoutingLinesTransferWIPItemDisabledForMachineCenterLine() + var + WorkCenter: Record "Work Center"; + RoutingHeader: Record "Routing Header"; + RoutingLine: Record "Routing Line"; + RoutingLines: TestPage "Routing Lines"; + MachineCenterNo: Code[20]; + begin + // [SCENARIO] Transfer WIP Item field is disabled on Routing Lines page for a Machine Center routing line, + // even when the parent Work Center has a Subcontractor No. + Initialize(); + + // [GIVEN] A Work Center with a Subcontractor No. + LibraryMfgManagement.CreateWorkCenterWithCalendar(WorkCenter, 0); + WorkCenter.Validate("Subcontractor No.", LibraryMfgManagement.CreateSubcontractorWithCurrency('')); + WorkCenter.Modify(true); + + // [GIVEN] A Machine Center belonging to that Work Center + LibraryMfgManagement.CreateMachineCenter(MachineCenterNo, WorkCenter."No.", 0); + + // [GIVEN] A Routing with a Machine Center routing line + LibraryManufacturing.CreateRoutingHeader(RoutingHeader, RoutingHeader.Type::Serial); + LibraryMfgManagement.CreateRoutingLineForMachineCenter(RoutingLine, RoutingHeader, MachineCenterNo); + + // [WHEN] The Routing Lines page is opened for that line + RoutingLines.OpenEdit(); + RoutingLines.GoToRecord(RoutingLine); + + // [THEN] Transfer WIP Item is not enabled (Machine Center type is not eligible for Transfer WIP Item) + Assert.IsFalse(RoutingLines."Transfer WIP Item".Enabled(), RoutingLineTransferWIPEnabledErr); + RoutingLines.Close(); + end; + + [Test] + procedure RoutingLinesTransferWIPItemEnabledForSubcontractingWorkCenterLine() + var + WorkCenter: Record "Work Center"; + RoutingHeader: Record "Routing Header"; + RoutingLine: Record "Routing Line"; + RoutingLines: TestPage "Routing Lines"; + begin + // [SCENARIO] Transfer WIP Item field is enabled on Routing Lines page for a Work Center routing line + // when the Work Center has a Subcontractor No. + Initialize(); + + // [GIVEN] A Work Center with a Subcontractor No. + LibraryMfgManagement.CreateWorkCenterWithCalendar(WorkCenter, 0); + WorkCenter.Validate("Subcontractor No.", LibraryMfgManagement.CreateSubcontractorWithCurrency('')); + WorkCenter.Modify(true); + + // [GIVEN] A Routing with a Work Center routing line + LibraryManufacturing.CreateRoutingHeader(RoutingHeader, RoutingHeader.Type::Serial); + LibraryMfgManagement.CreateRoutingLine(RoutingLine, RoutingHeader, WorkCenter."No."); + + // [WHEN] The Routing Lines page is opened for that line + RoutingLines.OpenEdit(); + RoutingLines.GoToRecord(RoutingLine); + + // [THEN] Transfer WIP Item is enabled (subcontracting Work Center type) + Assert.IsTrue(RoutingLines."Transfer WIP Item".Enabled(), RoutingLineTransferWIPNotEnabledErr); + RoutingLines.Close(); + end; + + [Test] + procedure RoutingVersionLinesTransferWIPItemDisabledForMachineCenterLine() + var + WorkCenter: Record "Work Center"; + RoutingHeader: Record "Routing Header"; + RoutingLine: Record "Routing Line"; + RoutingVersionLines: TestPage "Routing Version Lines"; + MachineCenterNo: Code[20]; + VersionCode: Code[20]; + begin + // [SCENARIO] Transfer WIP Item field is disabled on Routing Version Lines page for a Machine Center + // routing line, even when the parent Work Center has a Subcontractor No. + Initialize(); + + // [GIVEN] A Work Center with a Subcontractor No. + LibraryMfgManagement.CreateWorkCenterWithCalendar(WorkCenter, 0); + WorkCenter.Validate("Subcontractor No.", LibraryMfgManagement.CreateSubcontractorWithCurrency('')); + WorkCenter.Modify(true); + + // [GIVEN] A Machine Center belonging to that Work Center + LibraryMfgManagement.CreateMachineCenter(MachineCenterNo, WorkCenter."No.", 0); + + // [GIVEN] A Routing Version with a Machine Center routing line + LibraryManufacturing.CreateRoutingHeader(RoutingHeader, RoutingHeader.Type::Serial); + VersionCode := '1'; + CreateRoutingVersionAndMachineCenterLine(RoutingHeader."No.", VersionCode, MachineCenterNo, RoutingLine); + + // [WHEN] The Routing Version Lines page is opened for that line + RoutingVersionLines.OpenEdit(); + RoutingVersionLines.Filter.SetFilter("Routing No.", RoutingHeader."No."); + RoutingVersionLines.Filter.SetFilter("Version Code", VersionCode); + RoutingVersionLines.GoToRecord(RoutingLine); + + // [THEN] Transfer WIP Item is not enabled (Machine Center type is not eligible for Transfer WIP Item) + Assert.IsFalse(RoutingVersionLines."Transfer WIP Item".Enabled(), RoutingLineTransferWIPEnabledErr); + RoutingVersionLines.Close(); + end; + + [Test] + procedure RoutingVersionLinesTransferWIPItemEnabledForSubcontractingWorkCenterLine() + var + WorkCenter: Record "Work Center"; + RoutingHeader: Record "Routing Header"; + RoutingLine: Record "Routing Line"; + RoutingVersionLines: TestPage "Routing Version Lines"; + VersionCode: Code[20]; + begin + // [SCENARIO] Transfer WIP Item field is enabled on Routing Version Lines page for a Work Center routing line + // when the Work Center has a Subcontractor No. + Initialize(); + + // [GIVEN] A Work Center with a Subcontractor No. + LibraryMfgManagement.CreateWorkCenterWithCalendar(WorkCenter, 0); + WorkCenter.Validate("Subcontractor No.", LibraryMfgManagement.CreateSubcontractorWithCurrency('')); + WorkCenter.Modify(true); + + // [GIVEN] A Routing Version with a Work Center routing line + LibraryManufacturing.CreateRoutingHeader(RoutingHeader, RoutingHeader.Type::Serial); + VersionCode := '1'; + CreateRoutingVersionAndWorkCenterLine(RoutingHeader."No.", VersionCode, WorkCenter."No.", RoutingLine); + + // [WHEN] The Routing Version Lines page is opened for that line + RoutingVersionLines.OpenEdit(); + RoutingVersionLines.Filter.SetFilter("Routing No.", RoutingHeader."No."); + RoutingVersionLines.Filter.SetFilter("Version Code", VersionCode); + RoutingVersionLines.GoToRecord(RoutingLine); + + // [THEN] Transfer WIP Item is enabled (subcontracting Work Center type) + Assert.IsTrue(RoutingVersionLines."Transfer WIP Item".Enabled(), RoutingLineTransferWIPNotEnabledErr); + RoutingVersionLines.Close(); + end; + + [Test] + procedure RoutingLineTransferWIPItemValidationFailsForMachineCenterType() + var + WorkCenter: Record "Work Center"; + RoutingHeader: Record "Routing Header"; + RoutingLine: Record "Routing Line"; + MachineCenterNo: Code[20]; + begin + // [SCENARIO] Validating Transfer WIP Item = true on a Machine Center routing line fails + // with an error because the Type must be Work Center. + Initialize(); + + // [GIVEN] A Work Center with a Subcontractor No. + LibraryMfgManagement.CreateWorkCenterWithCalendar(WorkCenter, 0); + WorkCenter.Validate("Subcontractor No.", LibraryMfgManagement.CreateSubcontractorWithCurrency('')); + WorkCenter.Modify(true); + + // [GIVEN] A Machine Center belonging to that Work Center + LibraryMfgManagement.CreateMachineCenter(MachineCenterNo, WorkCenter."No.", 0); + + // [GIVEN] A Routing with a Machine Center routing line + LibraryManufacturing.CreateRoutingHeader(RoutingHeader, RoutingHeader.Type::Serial); + LibraryMfgManagement.CreateRoutingLineForMachineCenter(RoutingLine, RoutingHeader, MachineCenterNo); + + // [WHEN] Transfer WIP Item is set to true on the Machine Center routing line + // [THEN] An error is raised because the line type must be Work Center + asserterror RoutingLine.Validate("Transfer WIP Item", true); + Assert.ExpectedTestFieldError(RoutingLine.FieldCaption(Type), Format(RoutingLine.Type::"Work Center")); + end; + + local procedure CreateRoutingVersionAndWorkCenterLine(RoutingNo: Code[20]; VersionCode: Code[20]; WorkCenterNo: Code[20]; var RoutingLine: Record "Routing Line") + var + RoutingVersion: Record "Routing Version"; + CapacityUoM: Record "Capacity Unit of Measure"; + begin + RoutingVersion.Init(); + RoutingVersion.Validate("Routing No.", RoutingNo); + RoutingVersion."Version Code" := VersionCode; + RoutingVersion.Insert(true); + +#pragma warning disable AA0210 + CapacityUoM.SetRange(Type, CapacityUoM.Type::Minutes); +#pragma warning restore AA0210 + CapacityUoM.FindFirst(); + + RoutingLine.Init(); + RoutingLine.Validate("Routing No.", RoutingNo); + RoutingLine.Validate("Version Code", VersionCode); + RoutingLine.Validate("Operation No.", '10'); + RoutingLine.Validate(Type, RoutingLine.Type::"Work Center"); + RoutingLine.Validate("No.", WorkCenterNo); + RoutingLine.Validate("Setup Time", 1); + RoutingLine.Validate("Run Time", 1); + RoutingLine.Validate("Run Time Unit of Meas. Code", CapacityUoM.Code); + RoutingLine.Validate("Setup Time Unit of Meas. Code", CapacityUoM.Code); + RoutingLine.Insert(true); + end; + + local procedure CreateRoutingVersionAndMachineCenterLine(RoutingNo: Code[20]; VersionCode: Code[20]; MachineCenterNo: Code[20]; var RoutingLine: Record "Routing Line") + var + RoutingVersion: Record "Routing Version"; + CapacityUoM: Record "Capacity Unit of Measure"; + begin + RoutingVersion.Init(); + RoutingVersion.Validate("Routing No.", RoutingNo); + RoutingVersion."Version Code" := VersionCode; + RoutingVersion.Insert(true); + +#pragma warning disable AA0210 + CapacityUoM.SetRange(Type, CapacityUoM.Type::Minutes); +#pragma warning restore AA0210 + CapacityUoM.FindFirst(); + + RoutingLine.Init(); + RoutingLine.Validate("Routing No.", RoutingNo); + RoutingLine.Validate("Version Code", VersionCode); + RoutingLine.Validate("Operation No.", '10'); + RoutingLine.Validate(Type, RoutingLine.Type::"Machine Center"); + RoutingLine.Validate("No.", MachineCenterNo); + RoutingLine.Validate("Setup Time", 1); + RoutingLine.Validate("Run Time", 1); + RoutingLine.Validate("Run Time Unit of Meas. Code", CapacityUoM.Code); + RoutingLine.Validate("Setup Time Unit of Meas. Code", CapacityUoM.Code); + RoutingLine.Insert(true); + end; + local procedure GetNextItemLedgerEntryNo(): Integer var ItemLedgerEntry: Record "Item Ledger Entry"; @@ -1037,6 +1259,7 @@ codeunit 139990 "Subc. Subcontracting UI Test" LibraryTestInitialize: Codeunit "Library - Test Initialize"; LibraryVariableStorage: Codeunit "Library - Variable Storage"; LibraryWarehouse: Codeunit "Library - Warehouse"; + LibraryManufacturing: Codeunit "Library - Manufacturing"; LibraryMfgManagement: Codeunit "Subc. Library Mfg. Management"; SubcontractingMgmtLibrary: Codeunit "Subc. Management Library"; SubSetupLibrary: Codeunit "Subc. Setup Library"; @@ -1050,6 +1273,8 @@ codeunit 139990 "Subc. Subcontracting UI Test" ILEProdActionsNotEnabledErr: Label 'Production actions should be enabled for a subcontracting Item Ledger Entry.'; ILEPurchActionsEnabledErr: Label 'Purchase Order action should not be enabled for a non-subcontracting Item Ledger Entry.'; ILEPurchActionsNotEnabledErr: Label 'Purchase Order action should be enabled for a subcontracting Item Ledger Entry.'; + RoutingLineTransferWIPEnabledErr: Label 'Transfer WIP Item should not be enabled for a Machine Center routing line.'; + RoutingLineTransferWIPNotEnabledErr: Label 'Transfer WIP Item should be enabled for a subcontracting Work Center routing line.'; SetupNotCompletedQst: Label 'The Subcontracting setup is not complete. Are you sure you want to exit?'; MissingSubcontractingLocationMsg: Label 'Vendor %1 has no subcontracting location. This location is used to track components and work-in-process (WIP) items at the subcontractor. Choose a Subcontracting Location Code on the vendor before using this work center for subcontracting.', Comment = '%1 = Vendor No.'; NotificationIdErr: Label 'The subcontractor location notification ID is unexpected.'; @@ -1060,4 +1285,4 @@ codeunit 139990 "Subc. Subcontracting UI Test" SendNotificationTok: Label 'Send', Locked = true; VendorCardNoErr: Label 'The Vendor Card opened for an unexpected vendor.'; VendorNoTok: Label 'VendorNo', Locked = true; - } +} diff --git a/src/Apps/W1/Subcontracting/Test/Tests/SubcWIPAvailWarnTest.Codeunit.al b/src/Apps/W1/Subcontracting/Test/Tests/SubcWIPAvailWarnTest.Codeunit.al index ebdf9c760bb..c2629c4483e 100644 --- a/src/Apps/W1/Subcontracting/Test/Tests/SubcWIPAvailWarnTest.Codeunit.al +++ b/src/Apps/W1/Subcontracting/Test/Tests/SubcWIPAvailWarnTest.Codeunit.al @@ -55,7 +55,9 @@ codeunit 149912 "Subc. WIP Avail. Warn Test" UnbindSubscription(AvailCheckSpy); // [THEN] The Quantity is persisted and the item-availability warning check was NOT performed for the WIP item +#pragma warning disable AA0181 TransferLine.Find('='); +#pragma warning restore AA0181 Assert.AreEqual(NewQuantity, TransferLine.Quantity, 'Quantity should be updated on the WIP transfer line.'); Assert.IsFalse( AvailCheckSpy.WasInvokedForItem(Item."No."), @@ -96,7 +98,9 @@ codeunit 149912 "Subc. WIP Avail. Warn Test" UnbindSubscription(AvailCheckSpy); // [THEN] The item-availability warning check WAS performed for the normal item +#pragma warning disable AA0181 TransferLine.Find('='); +#pragma warning restore AA0181 Assert.AreEqual(NewQuantity, TransferLine.Quantity, 'Quantity should be updated on the transfer line.'); Assert.IsTrue( AvailCheckSpy.WasInvokedForItem(Item."No."), diff --git a/src/Apps/W1/Subcontracting/Test/Tests/SubcWIPTransCreateTest.Codeunit.al b/src/Apps/W1/Subcontracting/Test/Tests/SubcWIPTransCreateTest.Codeunit.al index 05e6d3ee833..0828d4c11e6 100644 --- a/src/Apps/W1/Subcontracting/Test/Tests/SubcWIPTransCreateTest.Codeunit.al +++ b/src/Apps/W1/Subcontracting/Test/Tests/SubcWIPTransCreateTest.Codeunit.al @@ -372,9 +372,9 @@ codeunit 149911 "Subc. WIP Trans. Create Test" RequisitionWkshName: Record "Requisition Wksh. Name"; TransferHeader: Record "Transfer Header"; WorkCenter: array[2] of Record "Work Center"; - LibraryWarehouse: Codeunit "Library - Warehouse"; - SubcCalculateSubContracts: Report "Subc. Calculate Subcontracts"; CarryOutActionMsgReq: Report "Carry Out Action Msg. - Req."; + SubcCalculateSubContracts: Report "Subc. Calculate Subcontracts"; + LibraryWarehouse: Codeunit "Library - Warehouse"; PurchaseHeaderPage: TestPage "Purchase Order"; begin // [SCENARIO 641284] Creating WIP transfer orders for purchase lines from production orders at different locations opens all transfer orders. @@ -415,7 +415,9 @@ codeunit 149911 "Subc. WIP Trans. Create Test" PurchaseLine.SetRange("Document Type", PurchaseLine."Document Type"::Order); PurchaseLine.SetRange(Type, PurchaseLine.Type::Item); +#pragma warning disable AA0210 PurchaseLine.SetRange("Work Center No.", WorkCenter[2]."No."); +#pragma warning restore AA0210 PurchaseLine.FindFirst(); PurchaseHeader.Get(PurchaseLine."Document Type", PurchaseLine."Document No."); PurchaseLine.SetRange("Document No.", PurchaseHeader."No."); @@ -1906,6 +1908,78 @@ codeunit 149911 "Subc. WIP Trans. Create Test" Assert.ExpectedError('Subcontracting Location Code'); end; + [Test] + procedure ProdOrderRoutingLineTransferWIPItemValidationFailsForMachineCenterType() + var + Item: Record Item; + MachineCenter: array[2] of Record "Machine Center"; + ProdOrderRoutingLine: Record "Prod. Order Routing Line"; + ProductionOrder: Record "Production Order"; + WorkCenter: array[2] of Record "Work Center"; + begin + // [SCENARIO] Validating Transfer WIP Item = true on a Prod. Order Routing Line with + // Machine Center type fails, even when the parent Work Center has a Subcontractor No. + Initialize(); + + // [GIVEN] Subcontracting work centers with machine centers and an item with routing + BOM + SubcWarehouseLibrary.CreateAndCalculateNeededWorkAndMachineCenter(WorkCenter, MachineCenter, true); + SubcWarehouseLibrary.CreateItemForProductionIncludeRoutingAndProdBOM(Item, WorkCenter, MachineCenter); + + // [GIVEN] A released production order to create Prod. Order Routing Lines + SubcontractingMgmtLibrary.CreateAndRefreshProductionOrder( + ProductionOrder, "Production Order Status"::Released, + ProductionOrder."Source Type"::Item, Item."No.", 1); + + // [GIVEN] A Prod. Order Routing Line with Type = Machine Center + ProdOrderRoutingLine.SetRange(Status, "Production Order Status"::Released); + ProdOrderRoutingLine.SetRange("Prod. Order No.", ProductionOrder."No."); + ProdOrderRoutingLine.SetRange(Type, ProdOrderRoutingLine.Type::"Machine Center"); + ProdOrderRoutingLine.FindFirst(); + + // [WHEN] Transfer WIP Item is set to true on the Machine Center routing line + // [THEN] An error is raised because the line type must be Work Center + asserterror ProdOrderRoutingLine.Validate("Transfer WIP Item", true); + Assert.ExpectedTestFieldError(ProdOrderRoutingLine.FieldCaption(Type), Format(ProdOrderRoutingLine.Type::"Work Center")); + end; + + [Test] + procedure ProdOrderRoutingPageTransferWIPItemDisabledForMachineCenterLine() + var + Item: Record Item; + MachineCenter: array[2] of Record "Machine Center"; + ProdOrderRoutingLine: Record "Prod. Order Routing Line"; + ProductionOrder: Record "Production Order"; + WorkCenter: array[2] of Record "Work Center"; + ProdOrderRtng: TestPage "Prod. Order Routing"; + begin + // [SCENARIO] Transfer WIP Item field is disabled on Prod. Order Routing page for a Machine + // Center routing line, even when the parent Work Center has a Subcontractor No. + Initialize(); + + // [GIVEN] Subcontracting work centers with machine centers and an item with routing + BOM + SubcWarehouseLibrary.CreateAndCalculateNeededWorkAndMachineCenter(WorkCenter, MachineCenter, true); + SubcWarehouseLibrary.CreateItemForProductionIncludeRoutingAndProdBOM(Item, WorkCenter, MachineCenter); + + // [GIVEN] A released production order to create Prod. Order Routing Lines + SubcontractingMgmtLibrary.CreateAndRefreshProductionOrder( + ProductionOrder, "Production Order Status"::Released, + ProductionOrder."Source Type"::Item, Item."No.", 1); + + // [GIVEN] A Prod. Order Routing Line with Type = Machine Center + ProdOrderRoutingLine.SetRange(Status, "Production Order Status"::Released); + ProdOrderRoutingLine.SetRange("Prod. Order No.", ProductionOrder."No."); + ProdOrderRoutingLine.SetRange(Type, ProdOrderRoutingLine.Type::"Machine Center"); + ProdOrderRoutingLine.FindFirst(); + + // [WHEN] The Prod. Order Routing page is opened for that line + ProdOrderRtng.OpenEdit(); + ProdOrderRtng.GoToRecord(ProdOrderRoutingLine); + + // [THEN] Transfer WIP Item is not enabled (Machine Center type is not eligible) + Assert.IsFalse(ProdOrderRtng."Transfer WIP Item".Enabled(), ProdOrderRoutingTransferWIPEnabledErr); + ProdOrderRtng.Close(); + end; + [PageHandler] procedure HandleTransferOrder(var TransfOrderPage: TestPage "Transfer Order") begin @@ -1985,7 +2059,7 @@ codeunit 149911 "Subc. WIP Trans. Create Test" RoutingLine.SetRange(Type, RoutingLine.Type::"Work Center"); RoutingLine.SetRange("No.", WorkCenterNo); RoutingLine.FindFirst(); - RoutingLine."Transfer WIP Item" := TransferWIPItem; + RoutingLine.Validate("Transfer WIP Item", TransferWIPItem); RoutingLine.Modify(true); RoutingHeader.Validate(Status, RoutingHeader.Status::Certified); @@ -2051,4 +2125,5 @@ codeunit 149911 "Subc. WIP Trans. Create Test" SubSetupLibrary: Codeunit "Subc. Setup Library"; SubcWarehouseLibrary: Codeunit "Subc. Warehouse Library"; IsInitialized: Boolean; + ProdOrderRoutingTransferWIPEnabledErr: Label 'Transfer WIP Item should not be enabled for a Machine Center prod. order routing line.'; } \ No newline at end of file diff --git a/src/Apps/W1/Subcontracting/Test/Tests/SubcWhseCombinedScenarios.Codeunit.al b/src/Apps/W1/Subcontracting/Test/Tests/SubcWhseCombinedScenarios.Codeunit.al index 7f87f49a262..520febe4913 100644 --- a/src/Apps/W1/Subcontracting/Test/Tests/SubcWhseCombinedScenarios.Codeunit.al +++ b/src/Apps/W1/Subcontracting/Test/Tests/SubcWhseCombinedScenarios.Codeunit.al @@ -259,13 +259,17 @@ codeunit 149906 "Subc. Whse Combined Scenarios" Assert.RecordCount(WarehouseReceiptLine, 2); // [GIVEN] The not-last operation has no operational bin or inventory quantity +#pragma warning disable AA0210 WarehouseReceiptLine.SetRange("Subc. Purchase Line Type", "Subc. Purchase Line Type"::NotLastOperation); +#pragma warning restore AA0210 WarehouseReceiptLine.FindFirst(); Assert.AreEqual('', WarehouseReceiptLine."Bin Code", 'Not-last operation should not use a bin'); Assert.AreEqual(0, WarehouseReceiptLine."Qty. (Base)", 'Not-last operation should have zero base quantity'); // [GIVEN] The last operation uses the receipt bin and carries the inventory quantity +#pragma warning disable AA0210 WarehouseReceiptLine.SetRange("Subc. Purchase Line Type", "Subc. Purchase Line Type"::LastOperation); +#pragma warning restore AA0210 WarehouseReceiptLine.FindFirst(); Assert.AreEqual(ReceiveBin.Code, WarehouseReceiptLine."Bin Code", 'Last operation should use the receipt bin'); Assert.AreEqual(Quantity, WarehouseReceiptLine."Qty. (Base)", 'Last operation should have the production quantity'); @@ -327,7 +331,9 @@ codeunit 149906 "Subc. Whse Combined Scenarios" Item, Location, ProductionOrder, PurchaseHeader, ReceiveBin, WarehouseReceiptHeader, WorkCenter, Quantity); WarehouseReceiptLine.SetRange("No.", WarehouseReceiptHeader."No."); WarehouseReceiptLine.SetRange("Source No.", PurchaseHeader."No."); +#pragma warning disable AA0210 WarehouseReceiptLine.SetRange("Subc. Purchase Line Type", "Subc. Purchase Line Type"::NotLastOperation); +#pragma warning restore AA0210 WarehouseReceiptLine.FindFirst(); // [WHEN] Item tracking is opened for the not-last operation