From c7e0554773ccec0b55a0dcb0ae3b353f52959e7a Mon Sep 17 00:00:00 2001 From: v-nesinghal Date: Wed, 9 Sep 2026 19:49:58 +0530 Subject: [PATCH 1/6] Fix --- .../Purchases/History/UndoPurchaseReceiptLine.Codeunit.al | 1 + .../W1/BaseApp/Sales/History/UndoSalesShipmentLine.Codeunit.al | 1 + 2 files changed, 2 insertions(+) diff --git a/src/Layers/W1/BaseApp/Purchases/History/UndoPurchaseReceiptLine.Codeunit.al b/src/Layers/W1/BaseApp/Purchases/History/UndoPurchaseReceiptLine.Codeunit.al index cc3d1749295..76389e5399e 100644 --- a/src/Layers/W1/BaseApp/Purchases/History/UndoPurchaseReceiptLine.Codeunit.al +++ b/src/Layers/W1/BaseApp/Purchases/History/UndoPurchaseReceiptLine.Codeunit.al @@ -294,6 +294,7 @@ codeunit 5813 "Undo Purchase Receipt Line" ItemJnlLine."Shortcut Dimension 2 Code" := PurchRcptLine."Shortcut Dimension 2 Code"; ItemJnlLine."Dimension Set ID" := PurchRcptLine."Dimension Set ID"; ItemJnlLine.Description := PurchRcptLine.Description; + ItemJnlLine."Drop Shipment" := (PurchRcptLine."Sales Order No." <> '') and (PurchRcptLine."Sales Order Line No." <> 0); if PurchRcptLine."Job No." = '' then begin ItemJnlLine.Correction := true; diff --git a/src/Layers/W1/BaseApp/Sales/History/UndoSalesShipmentLine.Codeunit.al b/src/Layers/W1/BaseApp/Sales/History/UndoSalesShipmentLine.Codeunit.al index ec5c33edf11..e07edd74be9 100644 --- a/src/Layers/W1/BaseApp/Sales/History/UndoSalesShipmentLine.Codeunit.al +++ b/src/Layers/W1/BaseApp/Sales/History/UndoSalesShipmentLine.Codeunit.al @@ -410,6 +410,7 @@ codeunit 5815 "Undo Sales Shipment Line" ItemJournalLine."Document Date" := SalesShipmentHeader."Document Date"; ItemJournalLine."Unit of Measure Code" := SalesShipmentLine2."Unit of Measure Code"; ItemJournalLine.Description := SalesShipmentLine2.Description; + ItemJournalLine."Drop Shipment" := SalesShipmentLine2."Drop Shipment"; OnAfterCopyItemJnlLineFromSalesShpt(ItemJournalLine, SalesShipmentHeader, SalesShipmentLine2, TempWarehouseJournalLine, WhseUndoQuantity, ItemLedgEntryNo, NextLineNo, TempGlobalItemLedgerEntry, TempGlobalItemEntryRelation, IsHandled); if IsHandled then From b997d85c7afdb03e9917dc5a90fbe367aebf3676 Mon Sep 17 00:00:00 2001 From: v-nesinghal Date: Wed, 9 Sep 2026 19:51:29 +0530 Subject: [PATCH 2/6] Invoke-MiApp --- .../RU/BaseApp/Sales/History/UndoSalesShipmentLine.Codeunit.al | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Layers/RU/BaseApp/Sales/History/UndoSalesShipmentLine.Codeunit.al b/src/Layers/RU/BaseApp/Sales/History/UndoSalesShipmentLine.Codeunit.al index 54b51b26d9d..2ffc8583e6e 100644 --- a/src/Layers/RU/BaseApp/Sales/History/UndoSalesShipmentLine.Codeunit.al +++ b/src/Layers/RU/BaseApp/Sales/History/UndoSalesShipmentLine.Codeunit.al @@ -410,6 +410,7 @@ codeunit 5815 "Undo Sales Shipment Line" ItemJournalLine."Document Date" := SalesShipmentHeader."Document Date"; ItemJournalLine."Unit of Measure Code" := SalesShipmentLine2."Unit of Measure Code"; ItemJournalLine.Description := SalesShipmentLine2.Description; + ItemJournalLine."Drop Shipment" := SalesShipmentLine2."Drop Shipment"; OnAfterCopyItemJnlLineFromSalesShpt(ItemJournalLine, SalesShipmentHeader, SalesShipmentLine2, TempWarehouseJournalLine, WhseUndoQuantity, ItemLedgEntryNo, NextLineNo, TempGlobalItemLedgerEntry, TempGlobalItemEntryRelation, IsHandled); if IsHandled then From 89674dbf1bf9451623ab6ebd698ca919cb573713 Mon Sep 17 00:00:00 2001 From: v-nesinghal Date: Thu, 10 Sep 2026 09:55:45 +0530 Subject: [PATCH 3/6] Automation --- .../SCMRTAMItemTrackingII.Codeunit.al | 94 +++++++++++++++++++ 1 file changed, 94 insertions(+) diff --git a/src/Layers/W1/Tests/SCM-Reservation/SCMRTAMItemTrackingII.Codeunit.al b/src/Layers/W1/Tests/SCM-Reservation/SCMRTAMItemTrackingII.Codeunit.al index 4afd386d18e..fd2c0dc2a96 100644 --- a/src/Layers/W1/Tests/SCM-Reservation/SCMRTAMItemTrackingII.Codeunit.al +++ b/src/Layers/W1/Tests/SCM-Reservation/SCMRTAMItemTrackingII.Codeunit.al @@ -4471,6 +4471,80 @@ codeunit 137059 "SCM RTAM Item Tracking-II" VerifyUndoneSalesShipmentLine(SalesHeader."No.", Item."No.", Quantity); end; + [Test] + [HandlerFunctions('SalesListPageHandler,ConfirmHandler')] + procedure UndoDropShipmentWithBlankBinAtBinMandatoryLocation() + var + // Bin: Record Bin; + Item: Record Item; + ItemLedgerEntry: Record "Item Ledger Entry"; + Location: Record Location; + PurchaseHeader: Record "Purchase Header"; + PurchaseLine: Record "Purchase Line"; + PurchRcptHeader: Record "Purch. Rcpt. Header"; + PurchRcptLine: Record "Purch. Rcpt. Line"; + SalesHeader: Record "Sales Header"; + SalesLine: Record "Sales Line"; + SalesShipmentHeader: Record "Sales Shipment Header"; + SalesShipmentLine: Record "Sales Shipment Line"; + WarehouseEntry: Record "Warehouse Entry"; + Quantity: Decimal; + begin + // [FEATURE] [AI test 0.4] [Undo Shipment] + // [SCENARIO 649618] A drop shipment with a blank bin can be undone at a bin-mandatory location. + Initialize(); + + // [GIVEN] A bin-mandatory location with a bin but no default bin for the item. + CreateLocationWithBinMandatory(Location); + + // [GIVEN] A drop-shipment sales order and linked purchase order have blank bin codes. + Quantity := LibraryRandom.RandInt(50); + CreateItemWithVendorNo(Item); + CreateSalesOrderWithPurchasingCode(SalesHeader, SalesLine, Item."No.", '', Quantity, false); + SalesLine.Validate("Location Code", Location.Code); + SalesLine.Validate("Drop Shipment", true); + SalesLine.Modify(true); + SalesLine.TestField("Bin Code", ''); + + CreatePurchaseHeaderAndGetDropShipment(PurchaseHeader, SalesHeader."Sell-to Customer No."); + PurchaseLine.SetRange("Document Type", PurchaseHeader."Document Type"); + PurchaseLine.SetRange("Document No.", PurchaseHeader."No."); + FindPurchaseLine(PurchaseLine, Item."No."); + PurchaseLine.TestField("Location Code", Location.Code); + PurchaseLine.TestField("Bin Code", ''); + + // [GIVEN] The purchase order is received, creating linked receipt and shipment lines with blank bins. + PostPurchaseDocument(PurchaseHeader."Document Type", PurchaseHeader."No.", true, false); + FindSalesShipmentHeader(SalesShipmentHeader, SalesHeader."No."); + SalesShipmentLine.SetRange("Document No.", SalesShipmentHeader."No."); + SalesShipmentLine.SetRange(Type, SalesShipmentLine.Type::Item); + SalesShipmentLine.FindFirst(); + SalesShipmentLine.TestField("Bin Code", ''); + PurchRcptHeader.SetRange("Order No.", PurchaseHeader."No."); + PurchRcptHeader.FindFirst(); + PurchRcptLine.SetRange("Document No.", PurchRcptHeader."No."); + PurchRcptLine.SetRange(Type, PurchRcptLine.Type::Item); + PurchRcptLine.FindFirst(); + PurchRcptLine.TestField("Bin Code", ''); + + // [WHEN] The sales shipment is undone. + UndoSalesShipment(SalesHeader."No."); + + // [THEN] Both orders are restored and all corrective item entries retain drop-shipment semantics. + VerifyQuantityForDropShipmentInSalesLine(SalesHeader, Item."No.", 0, Quantity); + VerifyQuantityForDropShipmentInPurchaseLine(PurchaseHeader, Item."No.", 0, Quantity); + VerifyUndoneSalesShipmentLine(SalesHeader."No.", Item."No.", Quantity); + VerifyUndonePurchRcptLine(PurchaseHeader."No.", Item."No.", Quantity); + ItemLedgerEntry.SetRange("Item No.", Item."No."); + ItemLedgerEntry.SetRange("Drop Shipment", true); + Assert.RecordCount(ItemLedgerEntry, 4); + + // [THEN] No physical warehouse-bin movement is created. + WarehouseEntry.SetRange("Item No.", Item."No."); + WarehouseEntry.SetRange("Location Code", Location.Code); + Assert.RecordIsEmpty(WarehouseEntry); + end; + local procedure Initialize() var LibraryERMCountryData: Codeunit "Library - ERM Country Data"; @@ -4704,6 +4778,14 @@ codeunit 137059 "SCM RTAM Item Tracking-II" Item.Modify(true); end; + local procedure CreateItemWithVendorNoAndPurchasingCode(var Item: Record Item) + begin + + LibraryInventory.CreateItem(Item); + Item.Validate("Vendor No.", LibraryPurchase.CreateVendorNo()); + Item.Modify(true); + end; + local procedure CreateAndPostItemJnlLineWithLot(ItemNo: Code[20]; LotNo: Code[50]; Qty: Decimal) var ItemJournalLine: Record "Item Journal Line"; @@ -6349,6 +6431,18 @@ codeunit 137059 "SCM RTAM Item Tracking-II" Assert.RecordIsNotEmpty(PurchRcptLine); end; + local procedure CreateLocationWithBinMandatory(var Location: Record Location) + var + Bin: Record Bin; + begin + LibraryWarehouse.CreateLocationWithInventoryPostingSetup(Location); + Location.Validate("Bin Mandatory", true); + Location.Validate("Default Bin Selection", Location."Default Bin Selection"::"Fixed Bin"); + Location.Modify(true); + LibraryWarehouse.CreateBin( + Bin, Location.Code, LibraryUtility.GenerateRandomCode(Bin.FieldNo(Code), Database::Bin), '', ''); + end; + [ModalPageHandler] [Scope('OnPrem')] procedure QuantityToCreatePageHandler(var EnterQuantityToCreate: TestPage "Enter Quantity to Create") From f2727e83216a13a60ada1746db9d5b1b68bbe0fe Mon Sep 17 00:00:00 2001 From: v-nesinghal Date: Thu, 10 Sep 2026 12:06:45 +0530 Subject: [PATCH 4/6] Remove unuse procedure --- .../SCM-Reservation/SCMRTAMItemTrackingII.Codeunit.al | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/Layers/W1/Tests/SCM-Reservation/SCMRTAMItemTrackingII.Codeunit.al b/src/Layers/W1/Tests/SCM-Reservation/SCMRTAMItemTrackingII.Codeunit.al index fd2c0dc2a96..0ec887beef0 100644 --- a/src/Layers/W1/Tests/SCM-Reservation/SCMRTAMItemTrackingII.Codeunit.al +++ b/src/Layers/W1/Tests/SCM-Reservation/SCMRTAMItemTrackingII.Codeunit.al @@ -4475,7 +4475,6 @@ codeunit 137059 "SCM RTAM Item Tracking-II" [HandlerFunctions('SalesListPageHandler,ConfirmHandler')] procedure UndoDropShipmentWithBlankBinAtBinMandatoryLocation() var - // Bin: Record Bin; Item: Record Item; ItemLedgerEntry: Record "Item Ledger Entry"; Location: Record Location; @@ -4778,14 +4777,6 @@ codeunit 137059 "SCM RTAM Item Tracking-II" Item.Modify(true); end; - local procedure CreateItemWithVendorNoAndPurchasingCode(var Item: Record Item) - begin - - LibraryInventory.CreateItem(Item); - Item.Validate("Vendor No.", LibraryPurchase.CreateVendorNo()); - Item.Modify(true); - end; - local procedure CreateAndPostItemJnlLineWithLot(ItemNo: Code[20]; LotNo: Code[50]; Qty: Decimal) var ItemJournalLine: Record "Item Journal Line"; From 3648cc6b01c181170c2752fd4910b45f959003c5 Mon Sep 17 00:00:00 2001 From: v-nesinghal Date: Thu, 10 Sep 2026 13:33:01 +0530 Subject: [PATCH 5/6] Change filter --- .../Tests/SCM-Reservation/SCMRTAMItemTrackingII.Codeunit.al | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Layers/W1/Tests/SCM-Reservation/SCMRTAMItemTrackingII.Codeunit.al b/src/Layers/W1/Tests/SCM-Reservation/SCMRTAMItemTrackingII.Codeunit.al index 0ec887beef0..bdc89df9ca2 100644 --- a/src/Layers/W1/Tests/SCM-Reservation/SCMRTAMItemTrackingII.Codeunit.al +++ b/src/Layers/W1/Tests/SCM-Reservation/SCMRTAMItemTrackingII.Codeunit.al @@ -4516,13 +4516,13 @@ codeunit 137059 "SCM RTAM Item Tracking-II" PostPurchaseDocument(PurchaseHeader."Document Type", PurchaseHeader."No.", true, false); FindSalesShipmentHeader(SalesShipmentHeader, SalesHeader."No."); SalesShipmentLine.SetRange("Document No.", SalesShipmentHeader."No."); - SalesShipmentLine.SetRange(Type, SalesShipmentLine.Type::Item); + SalesShipmentLine.SetRange("No.", Item."No."); SalesShipmentLine.FindFirst(); SalesShipmentLine.TestField("Bin Code", ''); PurchRcptHeader.SetRange("Order No.", PurchaseHeader."No."); PurchRcptHeader.FindFirst(); PurchRcptLine.SetRange("Document No.", PurchRcptHeader."No."); - PurchRcptLine.SetRange(Type, PurchRcptLine.Type::Item); + PurchRcptLine.SetRange("No.", Item."No."); PurchRcptLine.FindFirst(); PurchRcptLine.TestField("Bin Code", ''); From c3f2ea8d2ab041f41ae27acdeb949cfb5633b740 Mon Sep 17 00:00:00 2001 From: v-nesinghal Date: Thu, 10 Sep 2026 14:48:29 +0530 Subject: [PATCH 6/6] Resolved Key Issue --- .../W1/Tests/SCM-Reservation/SCMRTAMItemTrackingII.Codeunit.al | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Layers/W1/Tests/SCM-Reservation/SCMRTAMItemTrackingII.Codeunit.al b/src/Layers/W1/Tests/SCM-Reservation/SCMRTAMItemTrackingII.Codeunit.al index bdc89df9ca2..76e52c7ea4b 100644 --- a/src/Layers/W1/Tests/SCM-Reservation/SCMRTAMItemTrackingII.Codeunit.al +++ b/src/Layers/W1/Tests/SCM-Reservation/SCMRTAMItemTrackingII.Codeunit.al @@ -4516,13 +4516,12 @@ codeunit 137059 "SCM RTAM Item Tracking-II" PostPurchaseDocument(PurchaseHeader."Document Type", PurchaseHeader."No.", true, false); FindSalesShipmentHeader(SalesShipmentHeader, SalesHeader."No."); SalesShipmentLine.SetRange("Document No.", SalesShipmentHeader."No."); - SalesShipmentLine.SetRange("No.", Item."No."); SalesShipmentLine.FindFirst(); SalesShipmentLine.TestField("Bin Code", ''); + PurchRcptHeader.SetRange("Order No.", PurchaseHeader."No."); PurchRcptHeader.FindFirst(); PurchRcptLine.SetRange("Document No.", PurchRcptHeader."No."); - PurchRcptLine.SetRange("No.", Item."No."); PurchRcptLine.FindFirst(); PurchRcptLine.TestField("Bin Code", '');