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 f16ad942fe..b74bb028dc 100644 --- a/src/Apps/W1/Subcontracting/App/src/Manufacturing/SubcProdOrderRtng.PageExt.al +++ b/src/Apps/W1/Subcontracting/App/src/Manufacturing/SubcProdOrderRtng.PageExt.al @@ -216,14 +216,7 @@ pageextension 99001503 "Subc. Prod. Order Rtng." extends "Prod. Order Routing" PurchaseLine.SetRange("Operation No.", Rec."Operation No."); if PurchaseLine.IsEmpty() then Message(NoPurchOrderCreatedMsg, ProdOrderRoutingLine."Prod. Order No.") - end else begin - if NoOfCreatedPurchOrder = 1 then begin - SubcPurchaseOrderCreator.ClearOperationNoForCreatedPurchaseOrder(); - SubcPurchaseOrderCreator.SetOperationNoForCreatedPurchaseOrder(Rec."Operation No."); - SubcPurchaseOrderCreator.ClearRoutingReferenceNoForCreatedPurchaseOrder(); - SubcPurchaseOrderCreator.SetRoutingReferenceNoForCreatedPurchaseOrder(Rec."Routing Reference No."); - end; + end else SubcPurchaseOrderCreator.ShowCreatedPurchaseOrder(Rec."Prod. Order No.", NoOfCreatedPurchOrder); - end; end; } \ No newline at end of file diff --git a/src/Apps/W1/Subcontracting/App/src/Purchase/SubcPurchaseOrderCreator.Codeunit.al b/src/Apps/W1/Subcontracting/App/src/Purchase/SubcPurchaseOrderCreator.Codeunit.al index 485ebfa05a..6c804475e6 100644 --- a/src/Apps/W1/Subcontracting/App/src/Purchase/SubcPurchaseOrderCreator.Codeunit.al +++ b/src/Apps/W1/Subcontracting/App/src/Purchase/SubcPurchaseOrderCreator.Codeunit.al @@ -26,6 +26,7 @@ codeunit 99001557 "Subc. Purchase Order Creator" { var ManufacturingSetup: Record "Manufacturing Setup"; + CreatedPurchaseHeader: Record "Purchase Header"; PageManagement: Codeunit "Page Management"; UnitofMeasureManagement: Codeunit "Unit of Measure Management"; #if not CLEAN29 @@ -34,8 +35,6 @@ codeunit 99001557 "Subc. Purchase Order Creator" #pragma warning restore AL0432 #endif HasManufacturingSetup: Boolean; - OperationNo: Code[10]; - RoutingReferenceNo: Integer; PurchOrderCreatedSingularTxt: Label 'A purchase order was created.\\Do you want to view it?'; PurchOrderCreatedPluralTxt: Label '%1 purchase orders were created.\\Do you want to view them?', Comment = '%1 = number of purchase orders created'; PurchOrderAlreadyCreatedQst: Label 'Purchase orders have already been created.\\Do you want to view them?'; @@ -192,11 +191,10 @@ codeunit 99001557 "Subc. Purchase Order Creator" procedure ShowCreatedPurchaseOrder(ProdOrderNo: Code[20]; NoOfCreatedPurchOrder: Integer) var - PurchaseHeader: Record "Purchase Header"; - PurchaseLine: Record "Purchase Line"; InstructionMgt: Codeunit "Instruction Mgt."; SubcNotificationMgmt: Codeunit "Subc. Notification Mgmt."; IsHandled: Boolean; + NoOfMarkedPurchaseOrders: Integer; begin #if not CLEAN29 #pragma warning disable AL0432 @@ -208,29 +206,24 @@ codeunit 99001557 "Subc. Purchase Order Creator" if IsHandled then exit; - if NoOfCreatedPurchOrder = 0 then + CreatedPurchaseHeader.MarkedOnly(true); + NoOfMarkedPurchaseOrders := CreatedPurchaseHeader.Count(); + if NoOfMarkedPurchaseOrders = 0 then begin + CreatedPurchaseHeader.MarkedOnly(false); exit; + end; + if InstructionMgt.IsEnabled(SubcNotificationMgmt.GetShowCreatedSubContPurchOrderCode()) then - if InstructionMgt.ShowConfirm(GetPurchOrderCreatedMessage(NoOfCreatedPurchOrder), SubcNotificationMgmt.GetShowCreatedSubContPurchOrderCode()) and + if InstructionMgt.ShowConfirm(GetPurchOrderCreatedMessage(NoOfMarkedPurchaseOrders), SubcNotificationMgmt.GetShowCreatedSubContPurchOrderCode()) and GuiAllowed() - then begin - PurchaseLine.SetCurrentKey("Document Type", Type, "Prod. Order No."); - PurchaseLine.SetRange("Document Type", "Purchase Document Type"::Order); - PurchaseLine.SetRange(Type, "Purchase Line Type"::Item); - PurchaseLine.SetRange("Prod. Order No.", ProdOrderNo); - if NoOfCreatedPurchOrder > 1 then - PageManagement.PageRun(PurchaseLine) - else begin - PurchaseLine.SetLoadFields(SystemId); - if (NoOfCreatedPurchOrder = 1) and (OperationNo <> '') then - PurchaseLine.SetRange("Operation No.", OperationNo); - if (NoOfCreatedPurchOrder = 1) and (RoutingReferenceNo <> 0) then - PurchaseLine.SetRange("Routing Reference No.", RoutingReferenceNo); - PurchaseLine.FindFirst(); - PurchaseHeader.Get(PurchaseLine."Document Type", PurchaseLine."Document No."); - PageManagement.PageRun(PurchaseHeader); - end; - end; + then + if NoOfMarkedPurchaseOrders > 1 then + Page.Run(Page::"Purchase Order List", CreatedPurchaseHeader) + else + if CreatedPurchaseHeader.FindFirst() then + PageManagement.PageRun(CreatedPurchaseHeader); + + CreatedPurchaseHeader.MarkedOnly(false); end; local procedure GetPurchOrderCreatedMessage(NoOfCreatedPurchOrder: Integer): Text @@ -240,26 +233,6 @@ codeunit 99001557 "Subc. Purchase Order Creator" exit(PurchOrderCreatedSingularTxt); end; - internal procedure SetOperationNoForCreatedPurchaseOrder(OperationNoToSet: Code[10]) - begin - OperationNo := OperationNoToSet; - end; - - internal procedure ClearOperationNoForCreatedPurchaseOrder() - begin - Clear(OperationNo); - end; - - internal procedure SetRoutingReferenceNoForCreatedPurchaseOrder(RoutingReferenceNoToSet: Integer) - begin - RoutingReferenceNo := RoutingReferenceNoToSet; - end; - - internal procedure ClearRoutingReferenceNoForCreatedPurchaseOrder() - begin - Clear(RoutingReferenceNo); - end; - local procedure CheckProdOrderRtngLine(ProdOrderRoutingLine: Record "Prod. Order Routing Line"; var ProdOrderLine: Record "Prod. Order Line"): Boolean var WorkCenter: Record "Work Center"; @@ -324,6 +297,9 @@ codeunit 99001557 "Subc. Purchase Order Creator" var NoOfCreatedPurchOrder: Integer; begin + CreatedPurchaseHeader.Reset(); + CreatedPurchaseHeader.MarkedOnly(false); + CreatedPurchaseHeader.ClearMarks(); ProdOrderRoutingLine.SetRange(Type, "Capacity Type"::"Work Center"); ShowExistingPurchaseOrdersForRoutingLines(ProdOrderRoutingLine); if ProdOrderRoutingLine.FindSet() then @@ -371,6 +347,7 @@ codeunit 99001557 "Subc. Purchase Order Creator" var RequisitionLine: Record "Requisition Line"; CarryOutActionMsgReq: Report "Carry Out Action Msg. - Req."; + ExistingPurchaseOrderNos: List of [Code[20]]; begin ProdOrderLine.CalcFields("Total Exp. Oper. Output (Qty.)"); @@ -383,15 +360,72 @@ codeunit 99001557 "Subc. Purchase Order Creator" InsertReqWkshLine(ProdOrderRoutingLine, ProdOrderLine, ManufacturingSetup."Subcontracting Template Name", ManufacturingSetup."Subcontracting Batch Name", QtyToPurch); if RequisitionLine.FindFirst() then begin + CollectExistingSubcPurchaseOrderNos(ProdOrderLine, ProdOrderRoutingLine, ExistingPurchaseOrderNos); CarryOutActionMsgReq.UseRequestPage(false); CarryOutActionMsgReq.SetReqWkshLine(RequisitionLine); CarryOutActionMsgReq.SetHideDialog(true); CarryOutActionMsgReq.RunModal(); Clear(CarryOutActionMsgReq); NoOfCreatedPurchOrder += 1; + MarkNewlyCreatedSubcPurchaseOrder(ProdOrderLine, ProdOrderRoutingLine, ExistingPurchaseOrderNos); end; end; + local procedure CollectExistingSubcPurchaseOrderNos(ProdOrderLine: Record "Prod. Order Line"; ProdOrderRoutingLine: Record "Prod. Order Routing Line"; var ExistingPurchaseOrderNos: List of [Code[20]]) + var + PurchaseLine: Record "Purchase Line"; + begin + FilterSubcPurchaseLineForRoutingLine(PurchaseLine, ProdOrderLine, ProdOrderRoutingLine); + if PurchaseLine.FindSet() then + repeat + if not ExistingPurchaseOrderNos.Contains(PurchaseLine."Document No.") then + ExistingPurchaseOrderNos.Add(PurchaseLine."Document No."); + until PurchaseLine.Next() = 0; + end; + + local procedure MarkNewlyCreatedSubcPurchaseOrder(ProdOrderLine: Record "Prod. Order Line"; ProdOrderRoutingLine: Record "Prod. Order Routing Line"; ExistingPurchaseOrderNos: List of [Code[20]]) + var + PurchaseLine: Record "Purchase Line"; + NewPurchaseOrderMarked: Boolean; + begin + FilterSubcPurchaseLineForRoutingLine(PurchaseLine, ProdOrderLine, ProdOrderRoutingLine); + if PurchaseLine.FindSet() then + repeat + if not ExistingPurchaseOrderNos.Contains(PurchaseLine."Document No.") then + if CreatedPurchaseHeader.Get("Purchase Document Type"::Order, PurchaseLine."Document No.") then begin + CreatedPurchaseHeader.Mark(true); + NewPurchaseOrderMarked := true; + end; + until PurchaseLine.Next() = 0; + + if NewPurchaseOrderMarked then + exit; + + // Carry Out updated an existing open purchase order instead of creating a new one; + // mark it so the confirmation prompt can still open the affected order. + if PurchaseLine.FindSet() then + repeat + if CreatedPurchaseHeader.Get("Purchase Document Type"::Order, PurchaseLine."Document No.") then + CreatedPurchaseHeader.Mark(true); + until PurchaseLine.Next() = 0; + end; + + local procedure FilterSubcPurchaseLineForRoutingLine(var PurchaseLine: Record "Purchase Line"; ProdOrderLine: Record "Prod. Order Line"; ProdOrderRoutingLine: Record "Prod. Order Routing Line") + begin + PurchaseLine.Reset(); + PurchaseLine.SetCurrentKey("Prod. Order No.", "Prod. Order Line No.", "Routing No.", "Operation No."); + PurchaseLine.SetRange("Document Type", "Purchase Document Type"::Order); + PurchaseLine.SetRange(Type, "Purchase Line Type"::Item); + PurchaseLine.SetRange("Prod. Order No.", ProdOrderLine."Prod. Order No."); + PurchaseLine.SetRange("Prod. Order Line No.", ProdOrderLine."Line No."); + PurchaseLine.SetRange("Routing No.", ProdOrderRoutingLine."Routing No."); + PurchaseLine.SetRange("Routing Reference No.", ProdOrderRoutingLine."Routing Reference No."); + PurchaseLine.SetRange("Operation No.", ProdOrderRoutingLine."Operation No."); + PurchaseLine.SetRange("Planning Flexibility", "Reservation Planning Flexibility"::Unlimited); + PurchaseLine.SetRange("Quantity Received", 0); + PurchaseLine.SetLoadFields("Document No."); + end; + local procedure FilterReqLineWithProdOrderAndRtngLine(var RequisitionLine: Record "Requisition Line"; ProdOrderLine: Record "Prod. Order Line"; ProdOrderRoutingLine: Record "Prod. Order Routing Line") begin RequisitionLine.SetRange("Prod. Order No.", ProdOrderLine."Prod. Order No.");