Report 99003802 Copy Production Order Document, source in 29

Source29

src/Layers/W1/BaseApp/Manufacturing/Document/CopyProductionOrderDocument.Report.al278 lines, Copyright (c) Microsoft Corporation. MIT

// ------------------------------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.
// ------------------------------------------------------------------------------------------------
namespace Microsoft.Manufacturing.Document;

report 99003802 "Copy Production Order Document"
{
    Caption = 'Copy Production Order Document';
    ProcessingOnly = true;

    dataset
    {
    }

    requestpage
    {

        layout
        {
            area(content)
            {
                group(Options)
                {
                    Caption = 'Options';
                    field(Status; StatusType)
                    {
                        ApplicationArea = Manufacturing;
                        Caption = 'Status';
                        ToolTip = 'Specifies the status of the production order that you want to copy from. Click the field to see the existing production order status types.';

                        trigger OnValidate()
                        begin
                            DocNo := '';
                        end;
                    }
                    field(DocumentNo; DocNo)
                    {
                        ApplicationArea = Manufacturing;
                        Caption = 'Document No.';
                        ToolTip = 'Specifies the relevant production order number that you want to copy from. ';

                        trigger OnLookup(var Text: Text): Boolean
                        begin
                            LookupDocNo();
                        end;
                    }
                    field(IncludeHeader; IncludeHeader)
                    {
                        ApplicationArea = Manufacturing;
                        Caption = 'Include Header';
                        ToolTip = 'Specifies if you also want to copy the existing header information to the new production order record.';
                    }
                }
            }
        }

        actions
        {
        }

        trigger OnOpenPage()
        begin
            if DocNo <> '' then begin
                case StatusType of
                    StatusType::Simulated:
                        if FromProdOrder.Get(FromProdOrder.Status::Simulated, DocNo) then
                            ;
                    StatusType::Planned:
                        if FromProdOrder.Get(FromProdOrder.Status::Planned, DocNo) then
                            ;
                    StatusType::"Firm Planned":
                        if FromProdOrder.Get(FromProdOrder.Status::"Firm Planned", DocNo) then
                            ;
                    StatusType::Released:
                        if FromProdOrder.Get(FromProdOrder.Status::Released, DocNo) then
                            ;
                    StatusType::Finished:
                        if FromProdOrder.Get(FromProdOrder.Status::Finished, DocNo) then
                            ;
                    else
                        OnOpenPageOnCaseElse(StatusType, DocNo, FromProdOrder);
                end;
                if FromProdOrder."No." = '' then
                    DocNo := '';
            end;
        end;
    }

    labels
    {
    }

    trigger OnPreReport()
    begin
        if ToProdOrder."No." = '' then
            Error(Text000);

        if (ToProdOrder.Status = StatusType) and (ToProdOrder."No." = DocNo) then
            Error(Text002, FromProdOrder.TableCaption());

        if IncludeHeader then
            CopyProdOrder();

        CopyProdLines();
    end;

    var
        FromProdOrder: Record "Production Order";

#pragma warning disable AA0074
        Text000: Label 'You must enter a document number. ';
#pragma warning disable AA0470
        Text002: Label 'The %1 cannot be copied onto itself.';
#pragma warning restore AA0470
#pragma warning restore AA0074

    protected var
        ToProdOrder: Record "Production Order";
        StatusType: Enum "Production Order Status";
        DocNo: Code[20];
        IncludeHeader: Boolean;

    procedure SetProdOrder(var NewProdOrder: Record "Production Order")
    begin
        ToProdOrder := NewProdOrder;
    end;

    local procedure LookupDocNo()
    begin
        FromProdOrder.SetRange(Status, StatusType);
        FromProdOrder.SetRange("No.");
        if ToProdOrder.Status = StatusType then
            FromProdOrder.SetFilter("No.", '<>%1', ToProdOrder."No.");
        FromProdOrder."No." := DocNo;
        if PAGE.RunModal(0, FromProdOrder) = ACTION::LookupOK then
            DocNo := FromProdOrder."No.";
    end;

    local procedure CopyProdOrder()
    var
        FromProdOrder: Record "Production Order";
    begin
        FromProdOrder.SetRange(Status, StatusType);
        FromProdOrder.SetRange("No.", DocNo);
        if FromProdOrder.FindFirst() then begin
            ToProdOrder.Description := FromProdOrder.Description;
            ToProdOrder."Search Description" := FromProdOrder."Search Description";
            ToProdOrder."Description 2" := FromProdOrder."Description 2";
            ToProdOrder."Last Date Modified" := FromProdOrder."Last Date Modified";
            ToProdOrder."Source Type" := FromProdOrder."Source Type";
            ToProdOrder."Source No." := FromProdOrder."Source No.";
            ToProdOrder."Routing No." := FromProdOrder."Routing No.";
            ToProdOrder."Inventory Posting Group" := FromProdOrder."Inventory Posting Group";
            ToProdOrder."Gen. Prod. Posting Group" := FromProdOrder."Gen. Prod. Posting Group";
            ToProdOrder."Gen. Bus. Posting Group" := FromProdOrder."Gen. Bus. Posting Group";
            ToProdOrder."Starting Time" := FromProdOrder."Starting Time";
            ToProdOrder."Starting Date" := FromProdOrder."Starting Date";
            ToProdOrder."Ending Time" := FromProdOrder."Ending Time";
            ToProdOrder."Ending Date" := FromProdOrder."Ending Date";
            ToProdOrder."Due Date" := FromProdOrder."Due Date";
            ToProdOrder.Blocked := FromProdOrder.Blocked;
            ToProdOrder."Shortcut Dimension 1 Code" := FromProdOrder."Shortcut Dimension 1 Code";
            ToProdOrder."Shortcut Dimension 2 Code" := FromProdOrder."Shortcut Dimension 2 Code";
            ToProdOrder."Dimension Set ID" := FromProdOrder."Dimension Set ID";
            ToProdOrder."Location Code" := FromProdOrder."Location Code";
            ToProdOrder."Bin Code" := FromProdOrder."Bin Code";
            ToProdOrder."Low-Level Code" := FromProdOrder."Low-Level Code";
            ToProdOrder.Quantity := FromProdOrder.Quantity;
            ToProdOrder."Unit Cost" := FromProdOrder."Unit Cost";
            ToProdOrder."Cost Amount" := FromProdOrder."Cost Amount";
            ToProdOrder."Planned Order No." := FromProdOrder."Planned Order No.";
            ToProdOrder."Firm Planned Order No." := FromProdOrder."Firm Planned Order No.";
            ToProdOrder."Simulated Order No." := FromProdOrder."Simulated Order No.";
            ToProdOrder."Work Center Filter" := FromProdOrder."Work Center Filter";
            ToProdOrder."Capacity Type Filter" := FromProdOrder."Capacity Type Filter";
            ToProdOrder."Capacity No. Filter" := FromProdOrder."Capacity No. Filter";
            ToProdOrder."Date Filter" := FromProdOrder."Date Filter";
            ToProdOrder.Comment := FromProdOrder.Comment;
            OnBeforeToProdOrderModify(ToProdOrder, FromProdOrder);
            ToProdOrder.Modify();
        end;
    end;

    local procedure CopyProdLines()
    var
        FromProdOrderLine: Record "Prod. Order Line";
        ToProdOrderLine: Record "Prod. Order Line";
        LineNo: Integer;
    begin
        ToProdOrderLine.SetRange(Status, ToProdOrder.Status);
        ToProdOrderLine.SetRange("Prod. Order No.", ToProdOrder."No.");
        if ToProdOrderLine.FindLast() then
            LineNo := ToProdOrderLine."Line No." + 10000
        else
            LineNo := 10000;

        FromProdOrderLine.SetRange(Status, StatusType);
        FromProdOrderLine.SetRange("Prod. Order No.", DocNo);
        OnCopyProdLinesOnAfterFilterFromProdOrderLine(FromProdOrderLine, StatusType, DocNo);
        if FromProdOrderLine.Find('-') then
            repeat
                ToProdOrderLine."Line No." := LineNo;
                ToProdOrderLine.Status := ToProdOrder.Status;
                ToProdOrderLine."Prod. Order No." := ToProdOrder."No.";
                ToProdOrderLine."Item No." := FromProdOrderLine."Item No.";
                ToProdOrderLine."Variant Code" := FromProdOrderLine."Variant Code";
                ToProdOrderLine.Description := FromProdOrderLine.Description;
                ToProdOrderLine."Description 2" := FromProdOrderLine."Description 2";
                ToProdOrderLine."Location Code" := FromProdOrderLine."Location Code";
                ToProdOrderLine."Shortcut Dimension 1 Code" := FromProdOrderLine."Shortcut Dimension 1 Code";
                ToProdOrderLine."Shortcut Dimension 2 Code" := FromProdOrderLine."Shortcut Dimension 2 Code";
                ToProdOrderLine."Dimension Set ID" := FromProdOrderLine."Dimension Set ID";
                ToProdOrderLine."Bin Code" := FromProdOrderLine."Bin Code";
                ToProdOrderLine.Quantity := FromProdOrderLine.Quantity;
                ToProdOrderLine."Quantity (Base)" := FromProdOrderLine."Quantity (Base)";
                ToProdOrderLine."Remaining Quantity" := ToProdOrderLine.Quantity;
                ToProdOrderLine."Remaining Qty. (Base)" := ToProdOrderLine."Quantity (Base)";
                if ToProdOrder."Source Type" = ToProdOrder."Source Type"::Family then
                    ToProdOrderLine."Routing Reference No." := 0
                else
                    ToProdOrderLine."Routing Reference No." := ToProdOrderLine."Line No.";
                ToProdOrderLine."Due Date" := FromProdOrderLine."Due Date";
                ToProdOrderLine."Starting Date" := FromProdOrderLine."Starting Date";
                ToProdOrderLine."Starting Time" := FromProdOrderLine."Starting Time";
                ToProdOrderLine."Ending Date" := FromProdOrderLine."Ending Date";
                ToProdOrderLine."Ending Time" := FromProdOrderLine."Ending Time";
                ToProdOrderLine."Planning Level Code" := FromProdOrderLine."Planning Level Code";
                ToProdOrderLine.Priority := FromProdOrderLine.Priority;
                ToProdOrderLine."Production BOM No." := FromProdOrderLine."Production BOM No.";
                ToProdOrderLine."Routing No." := FromProdOrderLine."Routing No.";
                ToProdOrderLine."Inventory Posting Group" := FromProdOrderLine."Inventory Posting Group";
                ToProdOrderLine."Unit Cost" := FromProdOrderLine."Unit Cost";
                ToProdOrderLine."Cost Amount" := FromProdOrderLine."Cost Amount";
                ToProdOrderLine."Unit of Measure Code" := FromProdOrderLine."Unit of Measure Code";
                ToProdOrderLine."Production BOM Version Code" := FromProdOrderLine."Production BOM Version Code";
                ToProdOrderLine."Routing Version Code" := FromProdOrderLine."Routing Version Code";
                ToProdOrderLine."Routing Type" := FromProdOrderLine."Routing Type";
                ToProdOrderLine."Qty. per Unit of Measure" := FromProdOrderLine."Qty. per Unit of Measure";
                ToProdOrderLine."Capacity Type Filter" := FromProdOrderLine."Capacity Type Filter";
                ToProdOrderLine."Capacity No. Filter" := FromProdOrderLine."Capacity No. Filter";
                ToProdOrderLine."Scrap %" := FromProdOrderLine."Scrap %";
                ToProdOrderLine."Date Filter" := FromProdOrderLine."Date Filter";
                OnBeforeToProdOrderLineInsert(ToProdOrderLine, FromProdOrderLine);
                ToProdOrderLine.Insert();
                LineNo := LineNo + 10000;
            until FromProdOrderLine.Next() = 0;

        OnAfterCopyProdLines(ToProdOrderLine, FromProdOrderLine, IncludeHeader);
    end;

    [IntegrationEvent(true, false)]
    local procedure OnAfterCopyProdLines(var ToProdOrderLine: Record "Prod. Order Line"; FromProdOrderLine: Record "Prod. Order Line"; IncludeHeader: Boolean)
    begin
    end;

    [IntegrationEvent(true, false)]
    local procedure OnBeforeToProdOrderModify(var ToProdOrder: Record "Production Order"; FromProdOrder: Record "Production Order")
    begin
    end;

    [IntegrationEvent(true, false)]
    local procedure OnBeforeToProdOrderLineInsert(var ToProdOrderLine: Record "Prod. Order Line"; FromProdOrderLine: Record "Prod. Order Line")
    begin
    end;

    [IntegrationEvent(true, false)]
    local procedure OnCopyProdLinesOnAfterFilterFromProdOrderLine(var FromProdOrderLine: Record "Prod. Order Line"; StatusType: Enum "Production Order Status"; DocNo: Code[20])
    begin
    end;

    [IntegrationEvent(true, false)]
    local procedure OnOpenPageOnCaseElse(StatusType: Enum "Production Order Status"; DocNo: Code[20]; var FromProductionOrder: Record "Production Order")
    begin
    end;
}