From 3a1b9b38891ee1a6fb7b21fd3cae2aaf850c16bd Mon Sep 17 00:00:00 2001 From: alexei-dobriansky <77933119+alexei-dobriansky@users.noreply.github.com> Date: Fri, 3 Jul 2026 16:23:35 +0200 Subject: [PATCH 1/2] Bug 640321: Blanket Purch. Order to Order drops extended text for later items Codeunit 97 copied each blanket line to the order with "Attached to Line No." still pointing at the blanket line no.; IsPurchOrderLineToBeInserted then Get()s that stale line no. on the new order and, when the parent item lands on a different line no., skips the extended-text line. Add RemapAttachedToLineNo (mirroring the shipped Sales-side fix) to rewrite "Attached to Line No." to the parent's new order line no. before the insert check. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../BlanketPurchOrdertoOrder.Codeunit.al | 18 ++++ .../ERM/ERMPurchaseBlanketOrder.Codeunit.al | 101 ++++++++++++++++++ 2 files changed, 119 insertions(+) diff --git a/src/Layers/W1/BaseApp/Purchases/Document/BlanketPurchOrdertoOrder.Codeunit.al b/src/Layers/W1/BaseApp/Purchases/Document/BlanketPurchOrdertoOrder.Codeunit.al index 4136681d88..772c767470 100644 --- a/src/Layers/W1/BaseApp/Purchases/Document/BlanketPurchOrdertoOrder.Codeunit.al +++ b/src/Layers/W1/BaseApp/Purchases/Document/BlanketPurchOrdertoOrder.Codeunit.al @@ -101,6 +101,7 @@ codeunit 97 "Blanket Purch. Order to Order" PurchOrderLine."Shortcut Dimension 2 Code" := PurchBlanketOrderLine."Shortcut Dimension 2 Code"; PurchOrderLine."Dimension Set ID" := PurchBlanketOrderLine."Dimension Set ID"; PurchOrderLine.DefaultDeferralCode(); + RemapAttachedToLineNo(PurchBlanketOrderLine, PurchOrderLine); if IsPurchOrderLineToBeInserted(PurchOrderLine) then begin OnBeforeInsertPurchOrderLine(PurchOrderLine, PurchOrderHeader, PurchBlanketOrderLine, Rec); PurchOrderLine.Insert(); @@ -329,6 +330,23 @@ codeunit 97 "Blanket Purch. Order to Order" PurchOrderLine."Document Type", PurchOrderLine."Document No.", PurchOrderLine."Attached to Line No.")); end; + local procedure RemapAttachedToLineNo(PurchBlanketOrderLine: Record "Purchase Line"; var PurchOrderLine: Record "Purchase Line") + var + ParentPurchaseLine: Record "Purchase Line"; + begin + if PurchOrderLine."Attached to Line No." = 0 then + exit; + + ParentPurchaseLine.SetCurrentKey("Document Type", "Blanket Order No.", "Blanket Order Line No."); + ParentPurchaseLine.SetLoadFields("Line No."); + ParentPurchaseLine.SetRange("Document Type", PurchOrderLine."Document Type"); + ParentPurchaseLine.SetRange("Document No.", PurchOrderLine."Document No."); + ParentPurchaseLine.SetRange("Blanket Order No.", PurchBlanketOrderLine."Document No."); + ParentPurchaseLine.SetRange("Blanket Order Line No.", PurchBlanketOrderLine."Attached to Line No."); + if ParentPurchaseLine.FindFirst() then + PurchOrderLine."Attached to Line No." := ParentPurchaseLine."Line No."; + end; + [IntegrationEvent(false, false)] local procedure OnAfterPurchOrderLineInsert(var PurchaseLine: Record "Purchase Line"; var BlanketOrderPurchLine: Record "Purchase Line") begin diff --git a/src/Layers/W1/Tests/ERM/ERMPurchaseBlanketOrder.Codeunit.al b/src/Layers/W1/Tests/ERM/ERMPurchaseBlanketOrder.Codeunit.al index c5d57c26b0..aa440a28a7 100644 --- a/src/Layers/W1/Tests/ERM/ERMPurchaseBlanketOrder.Codeunit.al +++ b/src/Layers/W1/Tests/ERM/ERMPurchaseBlanketOrder.Codeunit.al @@ -35,6 +35,7 @@ codeunit 134326 "ERM Purchase Blanket Order" PayToAddressFieldsNotEditableErr: Label 'Pay-to address fields should not be editable.'; PayToAddressFieldsEditableErr: Label 'Pay-to address fields should be editable.'; DirectCostIsChangedErr: Label 'Direct Cost is changed on Quantity update.'; + WrongAttachedExtTextCountErr: Label 'Purchase Order must contain 2 extended-text lines attached to item %1 (order line no %2).', Comment = '%1 = Item No.; %2 = Purchase Order Line No.'; [Test] [Scope('OnPrem')] @@ -1449,6 +1450,106 @@ codeunit 134326 "ERM Purchase Blanket Order" Assert.IsTrue(PurchaseLine."Direct Unit Cost" = DirectCost, DirectCostIsChangedErr); end; + [Test] + procedure ExtendedTextStaysAttachedToParentOnOrderWhenMakingOrderWithMultipleItems() + var + Vendor: Record Vendor; + Item: array[2] of Record Item; + BlanketPurchaseHeader: Record "Purchase Header"; + OrderItemLine: Record "Purchase Line"; + OrderAttachedLine: Record "Purchase Line"; + NotificationLifecycleMgt: Codeunit "Notification Lifecycle Mgt."; + OrderNo: Code[20]; + i: Integer; + begin + // [SCENARIO 640321] Each item's extended-text lines on the new purchase order must be attached to that + // item's order line, not to the blanket parent line, even when multiple items have extended texts. + Initialize(); + + // [GIVEN] Two items, each with two extended texts. + CreateItemWithTwoExtendedTexts(Item[1]); + CreateItemWithTwoExtendedTexts(Item[2]); + + // [GIVEN] A vendor. + LibraryPurchase.CreateVendor(Vendor); + + // [GIVEN] A blanket purchase order with both items (auto-inserts the extended texts). + CreateBlanketPurchaseOrder(Vendor, Item[1], Item[2]); + + // [GIVEN] Find the blanket purchase header. + BlanketPurchaseHeader.SetRange("Document Type", BlanketPurchaseHeader."Document Type"::"Blanket Order"); + BlanketPurchaseHeader.SetRange("Buy-from Vendor No.", Vendor."No."); + BlanketPurchaseHeader.FindFirst(); + + // [WHEN] Make Order is run. + OrderNo := LibraryPurchase.BlanketPurchaseOrderMakeOrder(BlanketPurchaseHeader); + + // [THEN] Each item on the new order has two extended-text lines attached to its order line no. + for i := 1 to 2 do begin + OrderItemLine.Reset(); + OrderItemLine.SetRange("Document Type", OrderItemLine."Document Type"::Order); + OrderItemLine.SetRange("Document No.", OrderNo); + OrderItemLine.SetRange("No.", Item[i]."No."); + OrderItemLine.FindFirst(); + + OrderAttachedLine.Reset(); + OrderAttachedLine.SetRange("Document Type", OrderAttachedLine."Document Type"::Order); + OrderAttachedLine.SetRange("Document No.", OrderNo); + OrderAttachedLine.SetRange("Attached to Line No.", OrderItemLine."Line No."); + Assert.AreEqual( + 2, + OrderAttachedLine.Count(), + StrSubstNo(WrongAttachedExtTextCountErr, Item[i]."No.", OrderItemLine."Line No.")); + end; + + NotificationLifecycleMgt.RecallAllNotifications(); + end; + + local procedure CreateItemWithTwoExtendedTexts(var Item: Record Item) + var + ExtendedTextHeader: Record "Extended Text Header"; + ExtendedTextLine: array[2] of Record "Extended Text Line"; + begin + LibraryInventory.CreateItem(Item); + Item.Validate("Automatic Ext. Texts", true); + Item.Modify(true); + + LibraryInventory.CreateExtendedTextHeaderItem(ExtendedTextHeader, Item."No."); + ExtendedTextHeader.Validate("Purchase Blanket Order", true); + ExtendedTextHeader.Validate("Purchase Order", true); + ExtendedTextHeader.Modify(true); + + LibraryInventory.CreateExtendedTextLineItem(ExtendedTextLine[1], ExtendedTextHeader); + ExtendedTextLine[1].Validate(Text, LibraryUtility.GenerateRandomText(MaxStrLen(Item."No."))); + ExtendedTextLine[1].Modify(true); + + LibraryInventory.CreateExtendedTextLineItem(ExtendedTextLine[2], ExtendedTextHeader); + ExtendedTextLine[2].Validate(Text, LibraryUtility.GenerateRandomText(MaxStrLen(Item."No."))); + ExtendedTextLine[2].Modify(true); + end; + + local procedure CreateBlanketPurchaseOrder(Vendor: Record Vendor; Item: Record Item; Item2: Record Item) + var + BlanketPurchaseOrder: TestPage "Blanket Purchase Order"; + begin + BlanketPurchaseOrder.OpenNew(); + BlanketPurchaseOrder."Buy-from Vendor No.".SetValue(Vendor."No."); + BlanketPurchaseOrder.PurchLines.First(); + BlanketPurchaseOrder.PurchLines.Type.SetValue("Purchase Line Type"::Item); + BlanketPurchaseOrder.PurchLines."No.".SetValue(Item."No."); + BlanketPurchaseOrder.PurchLines.Quantity.SetValue(LibraryRandom.RandIntInRange(3, 3)); + Commit(); + BlanketPurchaseOrder.PurchLines.Next(); + BlanketPurchaseOrder.PurchLines.Next(); + BlanketPurchaseOrder.PurchLines.Next(); + BlanketPurchaseOrder.PurchLines.Type.SetValue("Purchase Line Type"::Item); + BlanketPurchaseOrder.PurchLines."No.".SetValue(Item2."No."); + BlanketPurchaseOrder.PurchLines.Quantity.SetValue(LibraryRandom.RandIntInRange(4, 4)); + Commit(); + BlanketPurchaseOrder.PurchLines.Next(); + BlanketPurchaseOrder.Close(); + end; + local procedure Initialize() var PurchaseHeader: Record "Purchase Header"; From 17396f3b85b2ecee6ced06113a156c88af17b361 Mon Sep 17 00:00:00 2001 From: alexei-dobriansky <77933119+alexei-dobriansky@users.noreply.github.com> Date: Fri, 3 Jul 2026 16:25:30 +0200 Subject: [PATCH 2/2] Bug 640321: Propagate Blanket Purch. Order extended-text fix to IT and NA layers Miapp propagation of the W1 RemapAttachedToLineNo fix and test to the IT and NA BaseApp and Tests layers. The IT BaseApp keeps its local InsertPurchaseHeader procedure alongside the new RemapAttachedToLineNo. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../BlanketPurchOrdertoOrder.Codeunit.al | 18 ++++ .../ERM/ERMPurchaseBlanketOrder.Codeunit.al | 101 ++++++++++++++++++ .../BlanketPurchOrdertoOrder.Codeunit.al | 18 ++++ .../ERM/ERMPurchaseBlanketOrder.Codeunit.al | 101 ++++++++++++++++++ 4 files changed, 238 insertions(+) diff --git a/src/Layers/IT/BaseApp/Purchases/Document/BlanketPurchOrdertoOrder.Codeunit.al b/src/Layers/IT/BaseApp/Purchases/Document/BlanketPurchOrdertoOrder.Codeunit.al index a06d5c23cd..25f9b2b48c 100644 --- a/src/Layers/IT/BaseApp/Purchases/Document/BlanketPurchOrdertoOrder.Codeunit.al +++ b/src/Layers/IT/BaseApp/Purchases/Document/BlanketPurchOrdertoOrder.Codeunit.al @@ -101,6 +101,7 @@ codeunit 97 "Blanket Purch. Order to Order" PurchOrderLine."Shortcut Dimension 2 Code" := PurchBlanketOrderLine."Shortcut Dimension 2 Code"; PurchOrderLine."Dimension Set ID" := PurchBlanketOrderLine."Dimension Set ID"; PurchOrderLine.DefaultDeferralCode(); + RemapAttachedToLineNo(PurchBlanketOrderLine, PurchOrderLine); if IsPurchOrderLineToBeInserted(PurchOrderLine) then begin OnBeforeInsertPurchOrderLine(PurchOrderLine, PurchOrderHeader, PurchBlanketOrderLine, Rec); PurchOrderLine.Insert(); @@ -342,6 +343,23 @@ codeunit 97 "Blanket Purch. Order to Order" PurchaseHeader.SetRange("Buy-from Vendor No."); end; + local procedure RemapAttachedToLineNo(PurchBlanketOrderLine: Record "Purchase Line"; var PurchOrderLine: Record "Purchase Line") + var + ParentPurchaseLine: Record "Purchase Line"; + begin + if PurchOrderLine."Attached to Line No." = 0 then + exit; + + ParentPurchaseLine.SetCurrentKey("Document Type", "Blanket Order No.", "Blanket Order Line No."); + ParentPurchaseLine.SetLoadFields("Line No."); + ParentPurchaseLine.SetRange("Document Type", PurchOrderLine."Document Type"); + ParentPurchaseLine.SetRange("Document No.", PurchOrderLine."Document No."); + ParentPurchaseLine.SetRange("Blanket Order No.", PurchBlanketOrderLine."Document No."); + ParentPurchaseLine.SetRange("Blanket Order Line No.", PurchBlanketOrderLine."Attached to Line No."); + if ParentPurchaseLine.FindFirst() then + PurchOrderLine."Attached to Line No." := ParentPurchaseLine."Line No."; + end; + [IntegrationEvent(false, false)] local procedure OnAfterPurchOrderLineInsert(var PurchaseLine: Record "Purchase Line"; var BlanketOrderPurchLine: Record "Purchase Line") begin diff --git a/src/Layers/IT/Tests/ERM/ERMPurchaseBlanketOrder.Codeunit.al b/src/Layers/IT/Tests/ERM/ERMPurchaseBlanketOrder.Codeunit.al index fc9951c0ed..28f31c2fa9 100644 --- a/src/Layers/IT/Tests/ERM/ERMPurchaseBlanketOrder.Codeunit.al +++ b/src/Layers/IT/Tests/ERM/ERMPurchaseBlanketOrder.Codeunit.al @@ -36,6 +36,7 @@ PayToAddressFieldsEditableErr: Label 'Pay-to address fields should be editable.'; DocumentDateError: Label '%1 cannot be greater than %2'; DirectCostIsChangedErr: Label 'Direct Cost is changed on Quantity update.'; + WrongAttachedExtTextCountErr: Label 'Purchase Order must contain 2 extended-text lines attached to item %1 (order line no %2).', Comment = '%1 = Item No.; %2 = Purchase Order Line No.'; [Test] [Scope('OnPrem')] @@ -1396,6 +1397,106 @@ Assert.IsTrue(PurchaseLine."Direct Unit Cost" = DirectCost, DirectCostIsChangedErr); end; + [Test] + procedure ExtendedTextStaysAttachedToParentOnOrderWhenMakingOrderWithMultipleItems() + var + Vendor: Record Vendor; + Item: array[2] of Record Item; + BlanketPurchaseHeader: Record "Purchase Header"; + OrderItemLine: Record "Purchase Line"; + OrderAttachedLine: Record "Purchase Line"; + NotificationLifecycleMgt: Codeunit "Notification Lifecycle Mgt."; + OrderNo: Code[20]; + i: Integer; + begin + // [SCENARIO 640321] Each item's extended-text lines on the new purchase order must be attached to that + // item's order line, not to the blanket parent line, even when multiple items have extended texts. + Initialize(); + + // [GIVEN] Two items, each with two extended texts. + CreateItemWithTwoExtendedTexts(Item[1]); + CreateItemWithTwoExtendedTexts(Item[2]); + + // [GIVEN] A vendor. + LibraryPurchase.CreateVendor(Vendor); + + // [GIVEN] A blanket purchase order with both items (auto-inserts the extended texts). + CreateBlanketPurchaseOrder(Vendor, Item[1], Item[2]); + + // [GIVEN] Find the blanket purchase header. + BlanketPurchaseHeader.SetRange("Document Type", BlanketPurchaseHeader."Document Type"::"Blanket Order"); + BlanketPurchaseHeader.SetRange("Buy-from Vendor No.", Vendor."No."); + BlanketPurchaseHeader.FindFirst(); + + // [WHEN] Make Order is run. + OrderNo := LibraryPurchase.BlanketPurchaseOrderMakeOrder(BlanketPurchaseHeader); + + // [THEN] Each item on the new order has two extended-text lines attached to its order line no. + for i := 1 to 2 do begin + OrderItemLine.Reset(); + OrderItemLine.SetRange("Document Type", OrderItemLine."Document Type"::Order); + OrderItemLine.SetRange("Document No.", OrderNo); + OrderItemLine.SetRange("No.", Item[i]."No."); + OrderItemLine.FindFirst(); + + OrderAttachedLine.Reset(); + OrderAttachedLine.SetRange("Document Type", OrderAttachedLine."Document Type"::Order); + OrderAttachedLine.SetRange("Document No.", OrderNo); + OrderAttachedLine.SetRange("Attached to Line No.", OrderItemLine."Line No."); + Assert.AreEqual( + 2, + OrderAttachedLine.Count(), + StrSubstNo(WrongAttachedExtTextCountErr, Item[i]."No.", OrderItemLine."Line No.")); + end; + + NotificationLifecycleMgt.RecallAllNotifications(); + end; + + local procedure CreateItemWithTwoExtendedTexts(var Item: Record Item) + var + ExtendedTextHeader: Record "Extended Text Header"; + ExtendedTextLine: array[2] of Record "Extended Text Line"; + begin + LibraryInventory.CreateItem(Item); + Item.Validate("Automatic Ext. Texts", true); + Item.Modify(true); + + LibraryInventory.CreateExtendedTextHeaderItem(ExtendedTextHeader, Item."No."); + ExtendedTextHeader.Validate("Purchase Blanket Order", true); + ExtendedTextHeader.Validate("Purchase Order", true); + ExtendedTextHeader.Modify(true); + + LibraryInventory.CreateExtendedTextLineItem(ExtendedTextLine[1], ExtendedTextHeader); + ExtendedTextLine[1].Validate(Text, LibraryUtility.GenerateRandomText(MaxStrLen(Item."No."))); + ExtendedTextLine[1].Modify(true); + + LibraryInventory.CreateExtendedTextLineItem(ExtendedTextLine[2], ExtendedTextHeader); + ExtendedTextLine[2].Validate(Text, LibraryUtility.GenerateRandomText(MaxStrLen(Item."No."))); + ExtendedTextLine[2].Modify(true); + end; + + local procedure CreateBlanketPurchaseOrder(Vendor: Record Vendor; Item: Record Item; Item2: Record Item) + var + BlanketPurchaseOrder: TestPage "Blanket Purchase Order"; + begin + BlanketPurchaseOrder.OpenNew(); + BlanketPurchaseOrder."Buy-from Vendor No.".SetValue(Vendor."No."); + BlanketPurchaseOrder.PurchLines.First(); + BlanketPurchaseOrder.PurchLines.Type.SetValue("Purchase Line Type"::Item); + BlanketPurchaseOrder.PurchLines."No.".SetValue(Item."No."); + BlanketPurchaseOrder.PurchLines.Quantity.SetValue(LibraryRandom.RandIntInRange(3, 3)); + Commit(); + BlanketPurchaseOrder.PurchLines.Next(); + BlanketPurchaseOrder.PurchLines.Next(); + BlanketPurchaseOrder.PurchLines.Next(); + BlanketPurchaseOrder.PurchLines.Type.SetValue("Purchase Line Type"::Item); + BlanketPurchaseOrder.PurchLines."No.".SetValue(Item2."No."); + BlanketPurchaseOrder.PurchLines.Quantity.SetValue(LibraryRandom.RandIntInRange(4, 4)); + Commit(); + BlanketPurchaseOrder.PurchLines.Next(); + BlanketPurchaseOrder.Close(); + end; + local procedure Initialize() var PurchaseHeader: Record "Purchase Header"; diff --git a/src/Layers/NA/BaseApp/Purchases/Document/BlanketPurchOrdertoOrder.Codeunit.al b/src/Layers/NA/BaseApp/Purchases/Document/BlanketPurchOrdertoOrder.Codeunit.al index 2d5ecbb42d..19f8d825dd 100644 --- a/src/Layers/NA/BaseApp/Purchases/Document/BlanketPurchOrdertoOrder.Codeunit.al +++ b/src/Layers/NA/BaseApp/Purchases/Document/BlanketPurchOrdertoOrder.Codeunit.al @@ -101,6 +101,7 @@ codeunit 97 "Blanket Purch. Order to Order" PurchOrderLine."Shortcut Dimension 2 Code" := PurchBlanketOrderLine."Shortcut Dimension 2 Code"; PurchOrderLine."Dimension Set ID" := PurchBlanketOrderLine."Dimension Set ID"; PurchOrderLine.DefaultDeferralCode(); + RemapAttachedToLineNo(PurchBlanketOrderLine, PurchOrderLine); if IsPurchOrderLineToBeInserted(PurchOrderLine) then begin OnBeforeInsertPurchOrderLine(PurchOrderLine, PurchOrderHeader, PurchBlanketOrderLine, Rec); PurchOrderLine.Insert(); @@ -331,6 +332,23 @@ codeunit 97 "Blanket Purch. Order to Order" PurchOrderLine."Document Type", PurchOrderLine."Document No.", PurchOrderLine."Attached to Line No.")); end; + local procedure RemapAttachedToLineNo(PurchBlanketOrderLine: Record "Purchase Line"; var PurchOrderLine: Record "Purchase Line") + var + ParentPurchaseLine: Record "Purchase Line"; + begin + if PurchOrderLine."Attached to Line No." = 0 then + exit; + + ParentPurchaseLine.SetCurrentKey("Document Type", "Blanket Order No.", "Blanket Order Line No."); + ParentPurchaseLine.SetLoadFields("Line No."); + ParentPurchaseLine.SetRange("Document Type", PurchOrderLine."Document Type"); + ParentPurchaseLine.SetRange("Document No.", PurchOrderLine."Document No."); + ParentPurchaseLine.SetRange("Blanket Order No.", PurchBlanketOrderLine."Document No."); + ParentPurchaseLine.SetRange("Blanket Order Line No.", PurchBlanketOrderLine."Attached to Line No."); + if ParentPurchaseLine.FindFirst() then + PurchOrderLine."Attached to Line No." := ParentPurchaseLine."Line No."; + end; + [IntegrationEvent(false, false)] local procedure OnAfterPurchOrderLineInsert(var PurchaseLine: Record "Purchase Line"; var BlanketOrderPurchLine: Record "Purchase Line") begin diff --git a/src/Layers/NA/Tests/ERM/ERMPurchaseBlanketOrder.Codeunit.al b/src/Layers/NA/Tests/ERM/ERMPurchaseBlanketOrder.Codeunit.al index 08db3c21b5..044255a3df 100644 --- a/src/Layers/NA/Tests/ERM/ERMPurchaseBlanketOrder.Codeunit.al +++ b/src/Layers/NA/Tests/ERM/ERMPurchaseBlanketOrder.Codeunit.al @@ -35,6 +35,7 @@ codeunit 134326 "ERM Purchase Blanket Order" PayToAddressFieldsNotEditableErr: Label 'Pay-to address fields should not be editable.'; PayToAddressFieldsEditableErr: Label 'Pay-to address fields should be editable.'; DirectCostIsChangedErr: Label 'Direct Cost is changed on Quantity update.'; + WrongAttachedExtTextCountErr: Label 'Purchase Order must contain 2 extended-text lines attached to item %1 (order line no %2).', Comment = '%1 = Item No.; %2 = Purchase Order Line No.'; [Test] [Scope('OnPrem')] @@ -1433,6 +1434,106 @@ codeunit 134326 "ERM Purchase Blanket Order" Assert.IsTrue(PurchaseLine."Direct Unit Cost" = DirectCost, DirectCostIsChangedErr); end; + [Test] + procedure ExtendedTextStaysAttachedToParentOnOrderWhenMakingOrderWithMultipleItems() + var + Vendor: Record Vendor; + Item: array[2] of Record Item; + BlanketPurchaseHeader: Record "Purchase Header"; + OrderItemLine: Record "Purchase Line"; + OrderAttachedLine: Record "Purchase Line"; + NotificationLifecycleMgt: Codeunit "Notification Lifecycle Mgt."; + OrderNo: Code[20]; + i: Integer; + begin + // [SCENARIO 640321] Each item's extended-text lines on the new purchase order must be attached to that + // item's order line, not to the blanket parent line, even when multiple items have extended texts. + Initialize(); + + // [GIVEN] Two items, each with two extended texts. + CreateItemWithTwoExtendedTexts(Item[1]); + CreateItemWithTwoExtendedTexts(Item[2]); + + // [GIVEN] A vendor. + LibraryPurchase.CreateVendor(Vendor); + + // [GIVEN] A blanket purchase order with both items (auto-inserts the extended texts). + CreateBlanketPurchaseOrder(Vendor, Item[1], Item[2]); + + // [GIVEN] Find the blanket purchase header. + BlanketPurchaseHeader.SetRange("Document Type", BlanketPurchaseHeader."Document Type"::"Blanket Order"); + BlanketPurchaseHeader.SetRange("Buy-from Vendor No.", Vendor."No."); + BlanketPurchaseHeader.FindFirst(); + + // [WHEN] Make Order is run. + OrderNo := LibraryPurchase.BlanketPurchaseOrderMakeOrder(BlanketPurchaseHeader); + + // [THEN] Each item on the new order has two extended-text lines attached to its order line no. + for i := 1 to 2 do begin + OrderItemLine.Reset(); + OrderItemLine.SetRange("Document Type", OrderItemLine."Document Type"::Order); + OrderItemLine.SetRange("Document No.", OrderNo); + OrderItemLine.SetRange("No.", Item[i]."No."); + OrderItemLine.FindFirst(); + + OrderAttachedLine.Reset(); + OrderAttachedLine.SetRange("Document Type", OrderAttachedLine."Document Type"::Order); + OrderAttachedLine.SetRange("Document No.", OrderNo); + OrderAttachedLine.SetRange("Attached to Line No.", OrderItemLine."Line No."); + Assert.AreEqual( + 2, + OrderAttachedLine.Count(), + StrSubstNo(WrongAttachedExtTextCountErr, Item[i]."No.", OrderItemLine."Line No.")); + end; + + NotificationLifecycleMgt.RecallAllNotifications(); + end; + + local procedure CreateItemWithTwoExtendedTexts(var Item: Record Item) + var + ExtendedTextHeader: Record "Extended Text Header"; + ExtendedTextLine: array[2] of Record "Extended Text Line"; + begin + LibraryInventory.CreateItem(Item); + Item.Validate("Automatic Ext. Texts", true); + Item.Modify(true); + + LibraryInventory.CreateExtendedTextHeaderItem(ExtendedTextHeader, Item."No."); + ExtendedTextHeader.Validate("Purchase Blanket Order", true); + ExtendedTextHeader.Validate("Purchase Order", true); + ExtendedTextHeader.Modify(true); + + LibraryInventory.CreateExtendedTextLineItem(ExtendedTextLine[1], ExtendedTextHeader); + ExtendedTextLine[1].Validate(Text, LibraryUtility.GenerateRandomText(MaxStrLen(Item."No."))); + ExtendedTextLine[1].Modify(true); + + LibraryInventory.CreateExtendedTextLineItem(ExtendedTextLine[2], ExtendedTextHeader); + ExtendedTextLine[2].Validate(Text, LibraryUtility.GenerateRandomText(MaxStrLen(Item."No."))); + ExtendedTextLine[2].Modify(true); + end; + + local procedure CreateBlanketPurchaseOrder(Vendor: Record Vendor; Item: Record Item; Item2: Record Item) + var + BlanketPurchaseOrder: TestPage "Blanket Purchase Order"; + begin + BlanketPurchaseOrder.OpenNew(); + BlanketPurchaseOrder."Buy-from Vendor No.".SetValue(Vendor."No."); + BlanketPurchaseOrder.PurchLines.First(); + BlanketPurchaseOrder.PurchLines.Type.SetValue("Purchase Line Type"::Item); + BlanketPurchaseOrder.PurchLines."No.".SetValue(Item."No."); + BlanketPurchaseOrder.PurchLines.Quantity.SetValue(LibraryRandom.RandIntInRange(3, 3)); + Commit(); + BlanketPurchaseOrder.PurchLines.Next(); + BlanketPurchaseOrder.PurchLines.Next(); + BlanketPurchaseOrder.PurchLines.Next(); + BlanketPurchaseOrder.PurchLines.Type.SetValue("Purchase Line Type"::Item); + BlanketPurchaseOrder.PurchLines."No.".SetValue(Item2."No."); + BlanketPurchaseOrder.PurchLines.Quantity.SetValue(LibraryRandom.RandIntInRange(4, 4)); + Commit(); + BlanketPurchaseOrder.PurchLines.Next(); + BlanketPurchaseOrder.Close(); + end; + local procedure Initialize() var PurchaseHeader: Record "Purchase Header";