From 9b5a91e57e01bb2c552e20a882cbf7ef33783f2d Mon Sep 17 00:00:00 2001 From: V-NESINGHAL Date: Thu, 23 Jul 2026 17:36:50 +0530 Subject: [PATCH 1/3] Fix and automation --- .../Inventory/Transfer/TransferLine.Table.al | 8 +- .../SCM/SCMTransferReservation.Codeunit.al | 126 ++++++++++++++++-- 2 files changed, 118 insertions(+), 16 deletions(-) diff --git a/src/Layers/W1/BaseApp/Inventory/Transfer/TransferLine.Table.al b/src/Layers/W1/BaseApp/Inventory/Transfer/TransferLine.Table.al index e5bfef2d4ed..c78a9a35834 100644 --- a/src/Layers/W1/BaseApp/Inventory/Transfer/TransferLine.Table.al +++ b/src/Layers/W1/BaseApp/Inventory/Transfer/TransferLine.Table.al @@ -1071,13 +1071,15 @@ table 5741 "Transfer Line" TestField("Quantity Shipped", "Quantity Received"); TestField("Qty. Shipped (Base)", "Qty. Received (Base)"); - CalcFields("Reserved Qty. Inbnd. (Base)", "Reserved Qty. Outbnd. (Base)"); - TestField("Reserved Qty. Inbnd. (Base)", 0); - TestField("Reserved Qty. Outbnd. (Base)", 0); OnDeleteOnBeforeDeleteRelatedData(Rec); TransferLineReserve.DeleteLine(Rec); + + CalcFields("Reserved Qty. Inbnd. (Base)", "Reserved Qty. Outbnd. (Base)"); + TestField("Reserved Qty. Inbnd. (Base)", 0); + TestField("Reserved Qty. Outbnd. (Base)", 0); + WhseValidateSourceLine.TransLineDelete(Rec); ItemChargeAssgntPurch.SetCurrentKey( diff --git a/src/Layers/W1/Tests/SCM/SCMTransferReservation.Codeunit.al b/src/Layers/W1/Tests/SCM/SCMTransferReservation.Codeunit.al index 4345ac4fcd4..a493b4a7800 100644 --- a/src/Layers/W1/Tests/SCM/SCMTransferReservation.Codeunit.al +++ b/src/Layers/W1/Tests/SCM/SCMTransferReservation.Codeunit.al @@ -9,33 +9,35 @@ codeunit 137269 "SCM Transfer Reservation" end; var + Assert: Codeunit Assert; LibraryERMCountryData: Codeunit "Library - ERM Country Data"; LibraryInventory: Codeunit "Library - Inventory"; - LibraryWarehouse: Codeunit "Library - Warehouse"; + LibraryItemTracking: Codeunit "Library - Item Tracking"; + LibraryJob: Codeunit "Library - Job"; + LibraryManufacturing: Codeunit "Library - Manufacturing"; + LibraryPlanning: Codeunit "Library - Planning"; LibraryPurchase: Codeunit "Library - Purchase"; + LibraryRandom: Codeunit "Library - Random"; LibrarySales: Codeunit "Library - Sales"; LibraryService: Codeunit "Library - Service"; - LibraryJob: Codeunit "Library - Job"; - LibraryItemTracking: Codeunit "Library - Item Tracking"; - LibraryPlanning: Codeunit "Library - Planning"; - LibraryManufacturing: Codeunit "Library - Manufacturing"; - LibraryVariableStorage: Codeunit "Library - Variable Storage"; LibrarySetupStorage: Codeunit "Library - Setup Storage"; - LibraryRandom: Codeunit "Library - Random"; - LibraryUtility: Codeunit "Library - Utility"; - Assert: Codeunit Assert; LibraryTestInitialize: Codeunit "Library - Test Initialize"; + LibraryUtility: Codeunit "Library - Utility"; + LibraryVariableStorage: Codeunit "Library - Variable Storage"; + LibraryWarehouse: Codeunit "Library - Warehouse"; isInitialized: Boolean; - ReservationEntryShipmentDateIncorrectErr: Label 'Reservation Entry Shipment Date is incorrect.'; Direction: Option Outbound,Inbound; ItemTrackingOption: Option AssignLotNo,SelectEntries,ChangeLotQty,AssignSerialNos; CounterOfConfirms: Integer; - DummyQst: Label 'Dummy Dialog Question?'; ConfirmDialogOccursErr: Label 'Confirm Dialog occurs.'; + DummyQst: Label 'Dummy Dialog Question?'; ExpectedDateConfclictErr: Label 'The change leads to a date conflict with existing reservations'; - UnexpectedErr: Label 'Unexpected Error occured.'; - ReservEntryQtyIncorrectErr: Label 'Reservation Entry Quantity is different than expected.'; + ReservationEntryShipmentDateIncorrectErr: Label 'Reservation Entry Shipment Date is incorrect.'; ReservationFromStockErr: Label 'Reservation from Stock must be %1 in %2.', Comment = '%1= Field Value, %2 =Table Caption.'; + ReservedQtyExpectedErr: Label 'Reserved Qty. Outbnd. (Base) is expected to be non-zero before deletion.'; + ReservEntryQtyIncorrectErr: Label 'Reservation Entry Quantity is different than expected.'; + TransferHeaderNotDeletedErr: Label 'Transfer Header should have been deleted.'; + UnexpectedErr: Label 'Unexpected Error occured.'; [Test] [Scope('OnPrem')] @@ -2078,6 +2080,104 @@ codeunit 137269 "SCM Transfer Reservation" Assert.RecordIsNotEmpty(ReservationEntry); end; + [Test] + procedure DeleteTransferHeaderWithReservedOutboundLine() + var + ReservationEntry: Record "Reservation Entry"; + TransferHeader: Record "Transfer Header"; + TransferLine: Record "Transfer Line"; + ItemNo: Code[20]; + begin + // [SCENARIO 641400] Deleting a Transfer Order header that has a reserved line succeeds and clears the reservation. + Initialize(); + + // [GIVEN] A released Transfer Order with one line reserved outbound from inventory. + CreateTransferOrderQtyOneReservedOutbound(TransferHeader, TransferLine); + ItemNo := TransferLine."Item No."; + + // [GIVEN] The reserved outbound quantity on the line is non-zero. + TransferLine.CalcFields("Reserved Qty. Outbnd. (Base)"); + Assert.AreNotEqual(0, TransferLine."Reserved Qty. Outbnd. (Base)", ReservedQtyExpectedErr); + + // [WHEN] Deleting the Transfer Order header. + TransferHeader.Delete(true); + + // [THEN] The header and its line are deleted without error. + Assert.IsFalse(TransferHeader.Get(TransferHeader."No."), TransferHeaderNotDeletedErr); + TransferLine.SetRange("Document No.", TransferHeader."No."); + Assert.RecordIsEmpty(TransferLine); + + // [THEN] No reservation entries remain for the item. + ReservationEntry.SetRange("Item No.", ItemNo); + Assert.RecordIsEmpty(ReservationEntry); + end; + + [Test] + procedure DeleteReservedOutboundTransferLine() + var + ReservationEntry: Record "Reservation Entry"; + TransferLine: Record "Transfer Line"; + DocumentNo: Code[20]; + ItemNo: Code[20]; + begin + // [SCENARIO 641400] Deleting an individual reserved Transfer Line succeeds and clears the reservation, consistent with header deletion. + Initialize(); + + // [GIVEN] A Transfer Order with one line reserved outbound from inventory. + CreateTransferLineQtyOneReservedOutbound(TransferLine); + ItemNo := TransferLine."Item No."; + DocumentNo := TransferLine."Document No."; + + // [GIVEN] The reserved outbound quantity on the line is non-zero. + TransferLine.CalcFields("Reserved Qty. Outbnd. (Base)"); + Assert.AreNotEqual(0, TransferLine."Reserved Qty. Outbnd. (Base)", ReservedQtyExpectedErr); + + // [WHEN] Deleting the Transfer Line. + TransferLine.Delete(true); + + // [THEN] The line is deleted without error. + TransferLine.SetRange("Document No.", DocumentNo); + Assert.RecordIsEmpty(TransferLine); + + // [THEN] No reservation entries remain for the item. + ReservationEntry.SetRange("Item No.", ItemNo); + Assert.RecordIsEmpty(ReservationEntry); + end; + + [Test] + procedure DeleteTransferHeaderAndLineWithReservationAreConsistent() + var + TransferHeaderForHeaderDelete: Record "Transfer Header"; + TransferHeaderForLineDelete: Record "Transfer Header"; + TransferLineForHeaderDelete: Record "Transfer Line"; + TransferLineForLineDelete: Record "Transfer Line"; + begin + // [SCENARIO 641400] Deleting a reserved Transfer Line and deleting the Transfer Order header both succeed, so the two paths behave consistently. + Initialize(); + + // [GIVEN] A reserved Transfer Order whose line will be deleted directly. + CreateTransferOrderQtyOneReservedOutbound(TransferHeaderForLineDelete, TransferLineForLineDelete); + + // [GIVEN] Another reserved Transfer Order whose header will be deleted. + CreateTransferOrderQtyOneReservedOutbound(TransferHeaderForHeaderDelete, TransferLineForHeaderDelete); + + // [WHEN] Deleting the line directly. + TransferLineForLineDelete.Delete(true); + + // [THEN] The line is gone. + TransferLineForLineDelete.SetRange("Document No.", TransferHeaderForLineDelete."No."); + Assert.RecordIsEmpty(TransferLineForLineDelete); + + // [WHEN] Deleting the header of the other order. + TransferHeaderForHeaderDelete.Delete(true); + + // [THEN] The header and its line are gone as well. + Assert.IsFalse( + TransferHeaderForHeaderDelete.Get(TransferHeaderForHeaderDelete."No."), TransferHeaderNotDeletedErr); + TransferLineForHeaderDelete.SetRange("Document No.", TransferHeaderForHeaderDelete."No."); + Assert.RecordIsEmpty(TransferLineForHeaderDelete); + end; + local procedure Initialize() begin LibraryTestInitialize.OnTestInitialize(CODEUNIT::"SCM Transfer Reservation"); From f2dfe0880c618641d74755c4a55a21319287cb73 Mon Sep 17 00:00:00 2001 From: V-NESINGHAL Date: Thu, 23 Jul 2026 17:38:06 +0530 Subject: [PATCH 2/3] Invoke-MiApp --- .../BaseApp/Inventory/Transfer/TransferLine.Table.al | 10 ++++++---- .../BaseApp/Inventory/Transfer/TransferLine.Table.al | 8 +++++--- .../BaseApp/Inventory/Transfer/TransferLine.Table.al | 8 +++++--- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/Layers/IT/BaseApp/Inventory/Transfer/TransferLine.Table.al b/src/Layers/IT/BaseApp/Inventory/Transfer/TransferLine.Table.al index ffa22d99b05..1763231cdc6 100644 --- a/src/Layers/IT/BaseApp/Inventory/Transfer/TransferLine.Table.al +++ b/src/Layers/IT/BaseApp/Inventory/Transfer/TransferLine.Table.al @@ -1,4 +1,4 @@ -// ------------------------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. // ------------------------------------------------------------------------------------------------ @@ -1400,13 +1400,15 @@ table 5741 "Transfer Line" TestField("Quantity Shipped", "Quantity Received"); TestField("Qty. Shipped (Base)", "Qty. Received (Base)"); - CalcFields("Reserved Qty. Inbnd. (Base)", "Reserved Qty. Outbnd. (Base)"); - TestField("Reserved Qty. Inbnd. (Base)", 0); - TestField("Reserved Qty. Outbnd. (Base)", 0); OnDeleteOnBeforeDeleteRelatedData(Rec); TransferLineReserve.DeleteLine(Rec); + + CalcFields("Reserved Qty. Inbnd. (Base)", "Reserved Qty. Outbnd. (Base)"); + TestField("Reserved Qty. Inbnd. (Base)", 0); + TestField("Reserved Qty. Outbnd. (Base)", 0); + WhseValidateSourceLine.TransLineDelete(Rec); ItemChargeAssgntPurch.SetCurrentKey( diff --git a/src/Layers/NA/BaseApp/Inventory/Transfer/TransferLine.Table.al b/src/Layers/NA/BaseApp/Inventory/Transfer/TransferLine.Table.al index 6f6a4de6bfb..ad5c26a6f6a 100644 --- a/src/Layers/NA/BaseApp/Inventory/Transfer/TransferLine.Table.al +++ b/src/Layers/NA/BaseApp/Inventory/Transfer/TransferLine.Table.al @@ -1081,13 +1081,15 @@ table 5741 "Transfer Line" TestField("Quantity Shipped", "Quantity Received"); TestField("Qty. Shipped (Base)", "Qty. Received (Base)"); - CalcFields("Reserved Qty. Inbnd. (Base)", "Reserved Qty. Outbnd. (Base)"); - TestField("Reserved Qty. Inbnd. (Base)", 0); - TestField("Reserved Qty. Outbnd. (Base)", 0); OnDeleteOnBeforeDeleteRelatedData(Rec); TransferLineReserve.DeleteLine(Rec); + + CalcFields("Reserved Qty. Inbnd. (Base)", "Reserved Qty. Outbnd. (Base)"); + TestField("Reserved Qty. Inbnd. (Base)", 0); + TestField("Reserved Qty. Outbnd. (Base)", 0); + WhseValidateSourceLine.TransLineDelete(Rec); ItemChargeAssgntPurch.SetCurrentKey( diff --git a/src/Layers/RU/BaseApp/Inventory/Transfer/TransferLine.Table.al b/src/Layers/RU/BaseApp/Inventory/Transfer/TransferLine.Table.al index 520b890867e..2b9303f8d43 100644 --- a/src/Layers/RU/BaseApp/Inventory/Transfer/TransferLine.Table.al +++ b/src/Layers/RU/BaseApp/Inventory/Transfer/TransferLine.Table.al @@ -1075,13 +1075,15 @@ table 5741 "Transfer Line" TestField("Quantity Shipped", "Quantity Received"); TestField("Qty. Shipped (Base)", "Qty. Received (Base)"); - CalcFields("Reserved Qty. Inbnd. (Base)", "Reserved Qty. Outbnd. (Base)"); - TestField("Reserved Qty. Inbnd. (Base)", 0); - TestField("Reserved Qty. Outbnd. (Base)", 0); OnDeleteOnBeforeDeleteRelatedData(Rec); TransferLineReserve.DeleteLine(Rec); + + CalcFields("Reserved Qty. Inbnd. (Base)", "Reserved Qty. Outbnd. (Base)"); + TestField("Reserved Qty. Inbnd. (Base)", 0); + TestField("Reserved Qty. Outbnd. (Base)", 0); + WhseValidateSourceLine.TransLineDelete(Rec); ItemChargeAssgntPurch.SetCurrentKey( From 261570eee9fef5c4fe0aa4d41a4df62c858b2e6b Mon Sep 17 00:00:00 2001 From: neeleshsinghal Date: Fri, 24 Jul 2026 10:52:02 +0530 Subject: [PATCH 3/3] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- src/Layers/IT/BaseApp/Inventory/Transfer/TransferLine.Table.al | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Layers/IT/BaseApp/Inventory/Transfer/TransferLine.Table.al b/src/Layers/IT/BaseApp/Inventory/Transfer/TransferLine.Table.al index 1763231cdc6..82d964f7826 100644 --- a/src/Layers/IT/BaseApp/Inventory/Transfer/TransferLine.Table.al +++ b/src/Layers/IT/BaseApp/Inventory/Transfer/TransferLine.Table.al @@ -1,4 +1,4 @@ -// ------------------------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. // ------------------------------------------------------------------------------------------------