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"; 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";